use super::DataEntry;
use crate::{class::Class, format_class};
use dioxus::prelude::*;
use zino_core::SharedString;
pub fn DataSelect<T: DataEntry + Clone + PartialEq>(props: DataSelectProps<T>) -> Element {
let class = format_class!(props, "select");
let fullwidth_class = Class::check("is-fullwidth", props.fullwidth);
let default_choice = props.options.first().cloned();
let entries = props.options.clone();
rsx! {
div {
class: "{class} {fullwidth_class}",
select {
name: "{props.name}",
required: props.required,
onmounted: move |_event| {
if let Some(handler) = props.on_select.as_ref() {
if let Some(entry) = default_choice.as_ref() {
handler.call(entry.clone());
}
}
},
onchange: move |event| {
if let Some(handler) = props.on_select.as_ref() {
let value = event.value();
if let Some(entry) = entries.iter().find(|d| d.value() == value) {
handler.call(entry.clone());
}
}
},
for entry in props.options {
option {
key: "{entry.key()}",
value: "{entry.value()}",
"{entry.label()}"
}
}
}
}
}
}
#[derive(Clone, PartialEq, Props)]
pub struct DataSelectProps<T: Clone + PartialEq + 'static> {
#[props(into)]
pub class: Option<Class>,
pub options: Vec<T>,
#[props(into)]
pub name: SharedString,
#[props(default = false)]
pub fullwidth: bool,
#[props(default = false)]
pub required: bool,
pub on_select: Option<EventHandler<T>>,
}