From 96ebfab4144a8a03accc8a266b79bd0d7cfb6ea1 Mon Sep 17 00:00:00 2001 From: Lucas Vas Date: Thu, 25 Sep 2025 10:10:19 -0400 Subject: [PATCH] feat: update select component to use open-ended structures --- src/components/radio.rs | 45 ++++++++++++++++++++++++++++++++--------- src/pages/home_page.rs | 30 ++++++++++++++------------- 2 files changed, 52 insertions(+), 23 deletions(-) diff --git a/src/components/radio.rs b/src/components/radio.rs index 0123571..561550a 100644 --- a/src/components/radio.rs +++ b/src/components/radio.rs @@ -1,4 +1,6 @@ +use std::collections::HashMap; use leptos::prelude::*; +use crate::components::ValueType; #[component] pub fn Radio( @@ -42,7 +44,9 @@ pub fn Radio( #[component] pub fn RadioList( - #[prop(default = RwSignal::new(String::new()))] selected: RwSignal, + // #[prop(default = RwSignal::new(String::new()))] selected: RwSignal, + #[prop(into)] data_member: String, + #[prop()] data_map: RwSignal>, #[prop()] items: Vec, #[prop(default = RwSignal::new(false))] disabled: RwSignal, #[prop(optional, into)] label: String, @@ -53,20 +57,43 @@ pub fn RadioList( {items .into_iter() .map(|item| { - let is_checked = { + let checked_signal = Signal::derive({ let item_name = item.clone(); - move || { selected.get() == item_name } + let data_member = data_member.clone(); + move || { + // Check if the value is contained in the data map's fields + let map = data_map.get(); + let value = map.get(&data_member); + let mut result = false; + if let Some(val) = value { + if val.is_string() { + result = val.as_string().unwrap().unwrap() == item_name + } + } + + result + } + }); + + let on_change = { + let item_name = item.clone(); + let data_member = data_member.clone(); + move || { + // Update the hash map + data_map.update(|map| { + if let Some(val) = map.get_mut(&data_member) { + *val = ValueType::String(Some(item_name.clone())); + } else { + map.insert(data_member.clone(), ValueType::String(Some(item_name.clone()))); + } + }); + } }; - let checked_signal = Signal::derive(is_checked); - // Check if this checkbox should be selected view! { impl IntoView { value=reactive_info.math_sat /> - // - // Each RadioList could be simplified into an enum: - // Radio { data_member, label, items } - // - // + + // Each RadioList could be simplified into an enum: + // Radio { data_member, label, items } + + // // Select { data_member, label, items } //