diff --git a/src/app.rs b/src/app.rs index a517025..7170ee1 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,12 +1,20 @@ -use crate::pages::{ProviderPortal, ScholarshipInfoPage, ProviderContactPage, LoanerShell, LoanerFallback, LoanerBorrowForm, LoanerReturnForm, AuthCallbackPage, ApplicantsPageFallback, AdminShell, AdminHomePage, AdminProviderPage, AdminScholarshipPage, AdminUtilsPage}; +use crate::components::ToastList; +use crate::components::login::ProviderLoginContext; use crate::pages::student; +use crate::pages::{ + AdminHomePage, AdminProviderPage, AdminScholarshipPage, AdminShell, AdminUtilsPage, + ApplicantsPageFallback, AuthCallbackPage, LoanerBorrowForm, LoanerFallback, LoanerReturnForm, + LoanerShell, ProviderContactPage, ProviderPortal, ScholarshipInfoPage, +}; use leptos::prelude::*; use leptos_meta::{MetaTags, Stylesheet, Title, provide_meta_context}; use leptos_oidc::AuthSignal; -use leptos_router::{components::{Route, Router, Routes, ParentRoute}, path, MatchNestedRoutes}; use leptos_router::any_nested_route::IntoAnyNestedRoute; -use crate::components::login::ProviderLoginContext; -use crate::components::ToastList; +use leptos_router::{ + MatchNestedRoutes, + components::{ParentRoute, Route, Router, Routes}, + path, +}; pub fn shell(options: LeptosOptions) -> impl IntoView { view! { @@ -86,8 +94,8 @@ fn ProviderRoutes() -> impl MatchNestedRoutes + Clone { } - .into_inner() - .into_any_nested_route() + .into_inner() + .into_any_nested_route() } #[component(transparent)] @@ -99,8 +107,8 @@ fn LoanerRoutes() -> impl MatchNestedRoutes + Clone { } - .into_inner() - .into_any_nested_route() + .into_inner() + .into_any_nested_route() } #[component(transparent)] @@ -113,8 +121,8 @@ fn AdminRoutes() -> impl MatchNestedRoutes + Clone { } - .into_inner() - .into_any_nested_route() + .into_inner() + .into_any_nested_route() } #[component(transparent)] @@ -126,6 +134,7 @@ fn StudentRoutes() -> impl MatchNestedRoutes + Clone { + impl MatchNestedRoutes + Clone { } - .into_inner() - .into_any_nested_route() + .into_inner() + .into_any_nested_route() } #[component] diff --git a/src/components/data_display.rs b/src/components/data_display.rs new file mode 100644 index 0000000..8dca269 --- /dev/null +++ b/src/components/data_display.rs @@ -0,0 +1,38 @@ +use crate::common::ValueType; +use leptos::prelude::*; +use std::collections::HashMap; + +#[component] +pub fn ValueDisplay( + #[prop(into)] data_member: Signal, + #[prop(into)] data_map: Signal>, + #[prop(into)] header: Signal, +) -> impl IntoView { + let display_value = Memo::new(move |_| { + data_map + .get() + .get(&data_member.get()) + .unwrap_or(&ValueType::String(None)) + .clone() + }); + + // I've chosen to display all information - we're not going to worry about the depth of the + // information, but we are going to provide a way to collapse information like maps and lists. + // This means we need some capsule-like appearance for the information in order to facilitate + // having a header and a series of information that's buried underneath. Also, we need to consider + // how we determine what the header is because that's not really procedurally possible. + + // One possible way to handle this is a "schema." We would plan out the information beforehand + // and pass through this schema struct, allowing us to limit what's displayed, relative to the + // starting data_map. I'll write this out in a scratch file for now. + + view! { +
+
{header}
+
{move || display_value.get().to_string()}
+
+ } +} + +#[component] +pub fn MapDisplay() {} diff --git a/src/components/mod.rs b/src/components/mod.rs index 89dc30c..106d43a 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -1,22 +1,23 @@ mod action_button; mod banner; mod dashboard_button; +mod data_display; mod date; +mod header; +mod lists; mod loading; +pub mod login; mod multi_entry; mod panel; mod row; +mod tabs; mod text_field; +mod toasts; mod utils; mod validated_form; -mod lists; -mod toasts; -mod header; -pub mod login; -mod tabs; pub use self::{ - action_button::*, banner::*, dashboard_button::*, lists::*, - loading::*, multi_entry::*, panel::*, row::*, text_field::*, - validated_form::*, toasts::*, header::*, date::*, tabs::* + action_button::*, banner::*, dashboard_button::*, data_display::*, date::*, header::*, + lists::*, loading::*, multi_entry::*, panel::*, row::*, tabs::*, text_field::*, toasts::*, + validated_form::*, }; diff --git a/src/pages/student/mod.rs b/src/pages/student/mod.rs index 5c3e5fa..cfe4aaa 100644 --- a/src/pages/student/mod.rs +++ b/src/pages/student/mod.rs @@ -1,24 +1,26 @@ -mod shell; -mod home_page; -mod demographics_page; +mod academics_page; mod additional_page; mod athletics_page; -mod academics_page; +mod demographics_page; +mod eligibility_page; mod extracurriculars_page; -mod work_experience_page; -mod university_page; mod family_info_page; mod form_setup; -mod eligibility_page; +mod home_page; +mod shell; +mod test_display; +mod university_page; +mod work_experience_page; -pub use shell::*; -pub use home_page::*; -pub use demographics_page::*; +pub use academics_page::*; pub use additional_page::*; pub use athletics_page::*; -pub use academics_page::*; +pub use demographics_page::*; +pub use eligibility_page::*; pub use extracurriculars_page::*; -pub use work_experience_page::*; -pub use university_page::*; pub use family_info_page::*; -pub use eligibility_page::*; \ No newline at end of file +pub use home_page::*; +pub use shell::*; +pub use test_display::*; +pub use university_page::*; +pub use work_experience_page::*; diff --git a/src/pages/student/shell.rs b/src/pages/student/shell.rs index fe958d3..023f24e 100644 --- a/src/pages/student/shell.rs +++ b/src/pages/student/shell.rs @@ -1,9 +1,9 @@ +use crate::common::{SubTabInfo, TabInfo}; +use crate::components::login::StudentLoginContext; +use crate::components::{Banner, Loading, TabSidebarList}; +use crate::pages::UnauthenticatedPage; use leptos::prelude::*; use leptos_oidc::{AuthLoaded, Authenticated}; -use crate::common::{SubTabInfo, TabInfo}; -use crate::components::{Banner, Loading, TabSidebarList}; -use crate::components::login::StudentLoginContext; -use crate::pages::UnauthenticatedPage; #[component] pub fn StudentShell() -> impl IntoView { @@ -39,6 +39,7 @@ pub fn StudentShell() -> impl IntoView { ), ), TabInfo::new("Eligible Scholarships", "eligibility", None), + TabInfo::new("Testing Display", "testing", None) ] /> diff --git a/src/pages/student/test_display.rs b/src/pages/student/test_display.rs new file mode 100644 index 0000000..b5c7cfa --- /dev/null +++ b/src/pages/student/test_display.rs @@ -0,0 +1,51 @@ +use crate::components::{Loading, ValueDisplay}; +use crate::pages::api::students::get_all_student_data; +use crate::utils::get_user_claims; +use leptos::prelude::*; + +#[component] +pub fn StudentTestDisplay() -> impl IntoView { + let user_claims = get_user_claims(); + let user_id = Memo::new(move |_| user_claims.get().map(|info| info.claims.subject.clone())); + + let resource = Resource::new( + move || user_id.get().unwrap_or_default(), + async move |id| get_all_student_data(id).await, + ); + + view! { + + {move || { + resource + .get() + .map(|data_map| { + let Ok(map) = data_map else { + return view! {}.into_any(); + }; + let data_map = StoredValue::new(map); + + view! { +
+ + } + } + /> +
+ } + .into_any() + }) + }} +
+ } +}