use vertigo::{
AttrGroup, Computed, Value, bind, component, computed_tuple, dom, render::render_list,
};
#[component]
pub fn DictSelect<T: Clone + From<String> + PartialEq + ToString + 'static>(
value: Value<i64>,
options: Computed<Vec<(i64, T)>>,
select: AttrGroup,
) {
let on_change = bind!(value, |new_value: String| {
value.set(new_value.parse().unwrap_or_default());
});
let empty = computed_tuple!(value, options).render_value_option(|(value, options)| {
options
.iter()
.all(|(key, _)| key != &value)
.then(|| dom! { <option value="" selected="selected" /> })
});
let list = render_list(&options, |(key, _)| key.to_string(), {
let value = value.clone();
move |item: &Computed<(i64, T)>| {
let key = item.map(|(key, _)| key);
let text_item = item.map(|(_, item)| item.to_string());
let selected = computed_tuple!(key, value)
.map(|(key, value)| (key == value).then(|| "selected".to_string()));
dom! { <option value={&key} {selected}>{text_item}</option> }
}
});
dom! {
<select {on_change} {..select}>
{empty}
{list}
</select>
}
}