From 12dfe502f4e57de09fbc49f8efa11315d704ce0d Mon Sep 17 00:00:00 2001 From: Lucas Vas Date: Tue, 10 Feb 2026 09:39:30 -0500 Subject: [PATCH 1/3] chore: rustfmt run --- src/app.rs | 10 +-- src/common/form_schema.rs | 84 ++++++++++++--------- src/pages/admin/scholarship_page.rs | 8 +- src/pages/student/academics_page.rs | 5 +- src/pages/student/athletics_page.rs | 5 +- src/pages/student/eligibility_page.rs | 103 ++++++++++++++++---------- src/pages/student/shell.rs | 4 +- 7 files changed, 117 insertions(+), 102 deletions(-) diff --git a/src/app.rs b/src/app.rs index bc50b33..a517025 100644 --- a/src/app.rs +++ b/src/app.rs @@ -136,14 +136,8 @@ fn StudentRoutes() -> impl MatchNestedRoutes + Clone { path=path!("additional/work-experience") view=student::StudentWorkExperiencePage /> - - + + } .into_inner() diff --git a/src/common/form_schema.rs b/src/common/form_schema.rs index f7bca1e..dc1099f 100644 --- a/src/common/form_schema.rs +++ b/src/common/form_schema.rs @@ -36,60 +36,70 @@ impl InputType { ) -> impl IntoView { view! { {match self { - InputType::Text(member, label, placeholder, required) => + InputType::Text(member, label, placeholder, required) => { view! { - }.into_any(), - InputType::Number(member, label, placeholder, required) => + } + .into_any() + } + InputType::Number(member, label, placeholder, required) => { view! { - }.into_any(), - InputType::Checkbox(member, label, options, required) => + } + .into_any() + } + InputType::Checkbox(member, label, options, required) => { view! { - }.into_any(), - InputType::Radio(member, label, options, required) => + } + .into_any() + } + InputType::Radio(member, label, options, required) => { view! { - }.into_any(), - InputType::Select(member, label, options, required) => + } + .into_any() + } + InputType::Select(member, label, options, required) => { view! { ::new(); + let data_member = StoredValue::new(data_member); // Register this input's validation signal. let validator_context = use_validation_context() .expect("FormValidSignal was not found"); - - let raw_value = Signal::derive({ - let data_member = data_member.clone(); - move || - data_map - .get() - .get(&data_member) - .unwrap_or(&ValueType::String(None)) - .to_string() - }); + + let display_value = RwSignal::new( + data_map.get_untracked() + .get(&data_member.get_value()) + .map(|v| v.to_string()) + .unwrap_or_default() + ); let dirty = RwSignal::new(false); let error = Signal::derive(move || - validate(required.get(), &raw_value.get(), &input_type.get()) + validate(required.get(), &display_value.get(), &input_type.get()) ); let show_errors = Signal::derive(move || { dirty.get() && matches!(error.get(), ValidationState::Invalid(_)) }); - let validator = RwSignal::new(InputState::new(data_member.clone(), error.clone(), dirty.clone())); + let validator = RwSignal::new(InputState::new(data_member.get_value(), error.clone(), dirty.clone())); validator_context.validators.update(|list| list.push(validator)); @@ -108,35 +107,42 @@ pub fn OutlinedTextField( }); }); - let str_type = Signal::derive(move || match input_type.get_untracked() { - TextFieldType::Number => "number", - _ => "text" // This is fine even for emails, as we're doing our own validation. - }); - let on_blur = move |_| { // Check validity of input's current value. The value will be updated by on_input, // and it should be a raw input (not parsed into a ValueType). dirty.set(true); }; + // Syncs data from the map into the display_value, only when the map is actually changed. + Effect::new(move || { + let new_value = data_map.get() + .get(&data_member.get_value()) + .map(|v| v.to_string()) + .unwrap_or_default(); + + if new_value != display_value.get_untracked() { + debug_log!("Found value from map: {}", new_value); + display_value.set(new_value); + } + }); + // This function parses the input into the correct type. It only accepts numbers or strings as // valid types, and parses them accordingly. - let on_input = { - let data_member = data_member.clone(); - move |e| { - let to_parse = event_target_value(&e); + let on_input = move |e| { + let to_parse = event_target_value(&e); + debug_log!("Setting value to display_value: {}", to_parse); + display_value.set(to_parse.clone()); + + // Push the new value to the data map. This happens regardless of whether the value parses + // or not. + data_map.update(|map| { let into_map = match input_type.get() { TextFieldType::Number => ValueType::Number(Some(to_parse)), _ => ValueType::String(Some(to_parse)) }; - // Edit the data map. Note that this should be uncoupled in the future - we don't want - // to update the map inside the component definition, but inside the page/form that - // created this input. - data_map.update(|map| { - map.insert(data_member.clone(), into_map); - }); - } + map.insert(data_member.get_value(), into_map); + }); }; view! { @@ -149,11 +155,11 @@ pub fn OutlinedTextField( transition-all duration-150 border-red-700 bg-transparent disabled:border-gray-600 disabled:pointer-events-none disabled:bg-gray-600/33" - r#type=str_type + r#type="text" disabled=disabled placeholder=placeholder prop:name=name - prop:value=raw_value + prop:value=display_value on:input=on_input on:blur=on_blur /> diff --git a/src/pages/student/academics_page.rs b/src/pages/student/academics_page.rs index 09b00fb..7a04cbb 100644 --- a/src/pages/student/academics_page.rs +++ b/src/pages/student/academics_page.rs @@ -7,53 +7,57 @@ pub fn StudentAcademicsPage() -> impl IntoView { let controller = use_student_form("academics"); view! { - -
-
- - - - - - - -
-
- + + {move || controller.data_resource.get().map(|_| + view! { +
+
+ + + + + + + +
+
+ }).collect_view() + } + } } \ No newline at end of file