From 1adeb5e07fc73dd59d80728eab9b2acf33c8549a Mon Sep 17 00:00:00 2001 From: Lucas Vas Date: Thu, 25 Sep 2025 10:38:42 -0400 Subject: [PATCH] feat: update select component to use open-ended structures (for real this time) A previous commit incorrectly called out the select component, except it really updated the radio component. --- src/components/select.rs | 25 ++++++++++++++++++++++--- src/pages/home_page.rs | 34 ++++++++++++++-------------------- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/src/components/select.rs b/src/components/select.rs index 20c6f60..edb26ed 100644 --- a/src/components/select.rs +++ b/src/components/select.rs @@ -1,4 +1,8 @@ +use std::collections::HashMap; +use leptos::ev::{Event, Targeted}; use leptos::prelude::*; +use leptos::web_sys::HtmlSelectElement; +use crate::components::ValueType; /// A custom-styled select input. /// @@ -8,9 +12,26 @@ use leptos::prelude::*; pub fn Select( #[prop(default = vec!["Test Value".into()])] value_list: Vec, #[prop(default = RwSignal::new("".into()))] value: RwSignal, + #[prop(into)] data_member: String, + #[prop()] data_map: RwSignal>, #[prop(optional, into)] label: String, #[prop(default = RwSignal::new(false))] disabled: RwSignal, ) -> impl IntoView { + + let on_change = { + let data_member = data_member.clone(); + move |e: Targeted| { + let target_value = e.target().value(); + data_map.update(|map| { + if let Some(val) = map.get_mut(&data_member) { + *val = ValueType::String(Some(target_value)); + } else { + map.insert(data_member.clone(), ValueType::String(Some(target_value))); + } + }); + } + }; + view! {