Skip to main content

dioxus_tw_components/components/
select.rs

1use dioxus::prelude::*;
2
3#[derive(Clone, PartialEq, Props)]
4pub struct SelectGroupProps {
5    #[props(extends = select, extends = GlobalAttributes)]
6    attributes: Vec<Attribute>,
7
8    #[props(optional)]
9    default_value: String,
10
11    #[props(optional)]
12    value: Signal<String>,
13
14    #[props(optional)]
15    onchange: EventHandler<FormEvent>,
16
17    children: Element,
18}
19
20#[component]
21pub fn SelectGroup(mut props: SelectGroupProps) -> Element {
22    let default_classes = "select-group";
23    crate::setup_class_attribute(&mut props.attributes, default_classes);
24
25    let oninput = move |event: FormEvent| {
26        props.value.set(event.data.value().clone());
27        props.onchange.call(event);
28    };
29
30    rsx! {
31        select {
32            oninput,
33            value: props.default_value,
34            ..props.attributes,
35            {props.children}
36        }
37    }
38}
39
40#[derive(Clone, PartialEq, Props)]
41pub struct SelectPlaceholderProps {
42    #[props(extends = option, extends = GlobalAttributes)]
43    attributes: Vec<Attribute>,
44
45    children: Element,
46}
47
48#[component]
49pub fn SelectPlaceholder(mut props: SelectPlaceholderProps) -> Element {
50    let default_classes = "select-placeholder";
51    crate::setup_class_attribute(&mut props.attributes, default_classes);
52
53    rsx! {
54        option { disabled: true, selected: true, value: r#"{""}"#, {props.children} }
55    }
56}
57
58#[derive(Clone, PartialEq, Props)]
59pub struct SelectLabelProps {
60    #[props(extends = optgroup, extends = GlobalAttributes)]
61    attributes: Vec<Attribute>,
62}
63
64#[component]
65pub fn SelectLabel(mut props: SelectLabelProps) -> Element {
66    let default_classes = "select-label";
67    crate::setup_class_attribute(&mut props.attributes, default_classes);
68
69    rsx! {
70        optgroup { ..props.attributes }
71    }
72}
73
74#[derive(Clone, PartialEq, Props)]
75pub struct SelectItemProps {
76    #[props(extends = option, extends = GlobalAttributes)]
77    attributes: Vec<Attribute>,
78
79    #[props(optional, default = None)]
80    selected: Option<bool>,
81
82    children: Element,
83}
84
85#[component]
86pub fn SelectItem(mut props: SelectItemProps) -> Element {
87    let default_classes = "select-item";
88    crate::setup_class_attribute(&mut props.attributes, default_classes);
89
90    if let Some(selected) = props.selected {
91        rsx! {
92            option { selected, ..props.attributes, {props.children} }
93        }
94    } else {
95        rsx! {
96            option { ..props.attributes,{props.children} }
97        }
98    }
99}