use super::*;
#[component]
pub fn euv_radio(node: VirtualNode<EuvRadioGroupProps>) -> VirtualNode {
let EuvRadioGroupProps {
name,
options,
value,
label: label_text,
}: EuvRadioGroupProps = node.try_get_props().unwrap_or_default();
let selected: String = value.get();
let items: Vec<VirtualNode> = options
.into_iter()
.map(|option: EuvRadioOption| {
let is_checked: bool = selected == option.value;
html! {
label {
class: c_euv_radio_item()
class: if is_checked {
c_euv_radio_item_checked()
} else {
c_euv_radio_item_unchecked()
}
input {
name: name
type: "radio"
value: option.value
checked: is_checked
class: c_euv_radio_input()
onchange: on_radio_change(value, option.value)
}
{
option.label
}
}
}
})
.collect();
html! {
div {
class: c_euv_radio_group()
div {
class: c_form_label()
label_text
}
items
}
}
}
pub fn on_radio_change(
signal: Signal<String>,
option_value: &'static str,
) -> Option<Rc<dyn Fn(Event)>> {
Some(Rc::new(move |event: Event| {
let reported: Option<String> = event.target().and_then(|target: EventTarget| {
if let Ok(input) = target.dyn_into::<HtmlInputElement>() {
return Some(input.value());
}
None
});
match reported {
Some(value) if !value.is_empty() => signal.set(value),
_ => signal.set(String::from(option_value)),
}
}))
}