diff --git a/src/app.rs b/src/app.rs index 27d79fa..1a00648 100644 --- a/src/app.rs +++ b/src/app.rs @@ -3,6 +3,7 @@ use leptos::prelude::*; use leptos_meta::{MetaTags, Stylesheet, Title, provide_meta_context}; use leptos_oidc::{Auth, AuthParameters, AuthSignal, Challenge}; use leptos_router::{components::{Route, Router, Routes, ParentRoute}, path}; +use crate::components::ToastList; pub fn shell(options: LeptosOptions) -> impl IntoView { view! { @@ -94,23 +95,25 @@ pub fn AppWithRoutes() -> impl IntoView { <main> - // TODO Create a 404 page - <Routes fallback=|| "Page not found.".into_view()> - <Route path=path!("") view=HomePage/> - <Route path=path!("/about") view=AboutPage/> - <Route path=path!("/test_page") view=TestPage/> - <Route path=path!("/comparison") view=ComparisonTestPage /> - <Route path=path!("/providers") view=ProviderPortal/> - <Route path=path!("/providers/profile") view=ProviderContactPage /> - <ParentRoute path=path!("/providers/scholarships") view=ScholarshipInfoPage> - <Route path=path!(":id") view=ScholarshipInfoPage/> - <Route path=path!("") view=ScholarshipInfoPage/> - </ParentRoute> - <ParentRoute path=path!("loaners") view=LoanerPage> - <Route path=path!("") view=LoanerPage /> - <Route path=path!(":form_name") view=LoanerPage /> - </ParentRoute> - </Routes> + <ToastList> + // TODO Create a 404 page + <Routes fallback=|| "Page not found.".into_view()> + <Route path=path!("") view=HomePage/> + <Route path=path!("/about") view=AboutPage/> + <Route path=path!("/test_page") view=TestPage/> + <Route path=path!("/comparison") view=ComparisonTestPage /> + <Route path=path!("/providers") view=ProviderPortal/> + <Route path=path!("/providers/profile") view=ProviderContactPage /> + <ParentRoute path=path!("/providers/scholarships") view=ScholarshipInfoPage> + <Route path=path!(":id") view=ScholarshipInfoPage/> + <Route path=path!("") view=ScholarshipInfoPage/> + </ParentRoute> + <ParentRoute path=path!("loaners") view=LoanerPage> + <Route path=path!("") view=LoanerPage /> + <Route path=path!(":form_name") view=LoanerPage /> + </ParentRoute> + </Routes> + </ToastList> </main> } } diff --git a/src/components/toasts/toast_list.rs b/src/components/toasts/toast_list.rs index c7f4639..94f9dcc 100644 --- a/src/components/toasts/toast_list.rs +++ b/src/components/toasts/toast_list.rs @@ -4,6 +4,7 @@ use crate::components::toasts::toast::Toast; #[derive(Clone, Debug)] pub struct Toast { id: String, + header: String, message: String, } @@ -11,10 +12,16 @@ impl Toast { pub fn new() -> Self { Toast { id: "".to_owned(), + header: "".to_owned(), message: "".to_owned(), } } + pub fn header(mut self, header: impl Into<String>) -> Self { + self.header = header.into(); + self + } + pub fn msg(mut self, msg: impl Into<String>) -> Self { self.message = msg.into(); self @@ -61,11 +68,11 @@ pub fn ToastList( <For each=move || context.messages.get() key=|toast| toast.id.clone() - let(Toast { id, message }) + let(Toast { id, header, message }) > <Toast message=message - title="Testing Toast" + title=header on_close=move || { context.messages.update(|list| list.retain(|v| v.id != id) diff --git a/src/components/validated_form.rs b/src/components/validated_form.rs index c862459..c19d45d 100644 --- a/src/components/validated_form.rs +++ b/src/components/validated_form.rs @@ -149,7 +149,7 @@ pub fn ValidatedForm( } button_type="submit" > - "Submit form (but actually)" + "Submit" </ActionButton> </form> } diff --git a/src/pages/provider_contact.rs b/src/pages/provider_contact.rs index 775d3c3..6bffcf6 100644 --- a/src/pages/provider_contact.rs +++ b/src/pages/provider_contact.rs @@ -3,7 +3,7 @@ use leptos::logging::log; use leptos::prelude::*; use leptos_oidc::{AuthLoaded, Authenticated}; use crate::common::ValueType; -use crate::components::{Banner, Loading, OutlinedTextField, Panel, Row, TextFieldType, ValidatedForm}; +use crate::components::{Banner, Loading, OutlinedTextField, Panel, Row, TextFieldType, Toast, ToastContext, ToastList, ValidatedForm}; use crate::pages::UnauthenticatedPage; use crate::pages::utils::get_user_claims; @@ -120,86 +120,101 @@ pub fn ProviderContactPage() -> impl IntoView { submit_action.pending().get() }); + let mut toasts_context = expect_context::<ToastContext>(); + Effect::new(move || { + submit_action.value().get().is_some() + .then(|| { + toasts_context.toast( + Toast::new() + .id(uuid::Uuid::new_v4()) + .header("Submission Successful") + .msg("You can go back or continue editing your responses.") + ); + }); + }); + // Display contact form. view! { - <Banner - title="R15 Scholarships" - logo="/PHS_Stacked_Acronym.png" - path="/" - /> + <Banner title="R15 Scholarships" logo="/PHS_Stacked_Acronym.png" path="/" /> <AuthLoaded fallback=Loading> <Authenticated unauthenticated=UnauthenticatedPage> <Suspense fallback=Loading> - <Panel> - <ValidatedForm on_submit=on_submit> - {move || contact_resource.get() - .map(|_| { - view! { - <Row> - <OutlinedTextField - label="First Name:" - placeholder="John" - disabled=elements_disabled - data_member="first_name" - data_map=contact_info - required=true - /> - <OutlinedTextField - label="Last Name:" - placeholder="Smith" - disabled=elements_disabled - data_member="last_name" - data_map=contact_info - required=true - /> - </Row> - <Row> - <OutlinedTextField - label="Contact Email:" - placeholder="student@region15.org" - disabled=elements_disabled - data_member="contact_email" - data_map=contact_info - input_type=TextFieldType::Email - required=true - /> - </Row> - <Row> - <OutlinedTextField - label="Phone Number:" - placeholder="123-456-7890" - disabled=elements_disabled - data_member="phone_number" - data_map=contact_info - required=true - /> - </Row> - <Row> - <OutlinedTextField - label="Street Address:" - placeholder="123 Fake Street" - disabled=elements_disabled - data_member="address" - data_map=contact_info - required=true - /> - </Row> - <Row> - <OutlinedTextField - label="Testing Number" - placeholder="Just put a number" - disabled=elements_disabled - data_member="testing_number" - data_map=contact_info - input_type=TextFieldType::Number - required=true - /> - </Row> - } - }) - } - </ValidatedForm> - </Panel> + <div class="flex flex-row"> + <div class="flex flex-col flex-1" /> + <Panel> + <ValidatedForm on_submit=on_submit> + {move || { + contact_resource + .get() + .map(|_| { + view! { + <Row> + <OutlinedTextField + label="First Name:" + placeholder="John" + disabled=elements_disabled + data_member="first_name" + data_map=contact_info + required=true + /> + <OutlinedTextField + label="Last Name:" + placeholder="Smith" + disabled=elements_disabled + data_member="last_name" + data_map=contact_info + required=true + /> + </Row> + <Row> + <OutlinedTextField + label="Contact Email:" + placeholder="student@region15.org" + disabled=elements_disabled + data_member="contact_email" + data_map=contact_info + input_type=TextFieldType::Email + required=true + /> + </Row> + <Row> + <OutlinedTextField + label="Phone Number:" + placeholder="123-456-7890" + disabled=elements_disabled + data_member="phone_number" + data_map=contact_info + required=true + /> + </Row> + <Row> + <OutlinedTextField + label="Street Address:" + placeholder="123 Fake Street" + disabled=elements_disabled + data_member="address" + data_map=contact_info + required=true + /> + </Row> + <Row> + <OutlinedTextField + label="Testing Number" + placeholder="Just put a number" + disabled=elements_disabled + data_member="testing_number" + data_map=contact_info + input_type=TextFieldType::Number + required=true + /> + </Row> + } + }) + }} + </ValidatedForm> + </Panel> + <div class="flex flex-col flex-1" /> + </div> </Suspense> </Authenticated> </AuthLoaded>