use dioxus::prelude::*;
#[derive(Clone, PartialEq)]
pub enum RadioSize {
Large,
Default,
Small,
}
impl RadioSize {
pub fn as_class(&self) -> &'static str {
match self {
RadioSize::Large => "el-radio--large",
RadioSize::Default => "",
RadioSize::Small => "el-radio--small",
}
}
}
#[derive(Props, Clone, PartialEq)]
pub struct RadioProps {
#[props(default)]
pub children: Option<Element>,
#[props(default)]
pub label: Option<String>,
pub value: String,
#[props(default = false)]
pub model_value: bool,
#[props(default = false)]
pub disabled: bool,
#[props(default = false)]
pub border: bool,
#[props(default = RadioSize::Default)]
pub size: RadioSize,
#[props(default)]
pub name: Option<String>,
#[props(default)]
pub on_change: Option<EventHandler<String>>,
#[props(default)]
pub class: Option<String>,
#[props(default)]
pub style: Option<String>,
}
#[component]
pub fn Radio(props: RadioProps) -> Element {
let mut class_names = vec!["el-radio".to_string()];
let size_class = props.size.as_class();
if !size_class.is_empty() {
class_names.push(size_class.to_string());
}
if props.model_value {
class_names.push("is-checked".to_string());
}
if props.disabled {
class_names.push("is-disabled".to_string());
}
if props.border {
class_names.push("is-bordered".to_string());
}
if let Some(ref custom_class) = props.class {
class_names.push(custom_class.clone());
}
let class_string = class_names.join(" ");
let style_string = props.style.clone().unwrap_or_default();
let value_clone1 = props.value.clone();
let value_clone2 = props.value.clone();
rsx! {
label {
class: "{class_string}",
style: "{style_string}",
role: "radio",
aria_checked: "{props.model_value}",
span {
class: "el-radio__input",
span {
class: "el-radio__inner",
}
input {
r#type: "radio",
class: "el-radio__original",
name: props.name.clone().unwrap_or_default(),
value: "{props.value}",
checked: props.model_value,
onchange: move |_| {
if !props.disabled {
if let Some(handler) = props.on_change {
handler.call(value_clone1.clone());
}
}
},
}
}
span {
class: "el-radio__label",
onclick: move |_| {
if !props.disabled {
if let Some(handler) = props.on_change {
handler.call(value_clone2.clone());
}
}
},
if let Some(ref label) = props.label {
"{label}"
}
{props.children}
}
}
}
}
#[derive(Props, Clone, PartialEq)]
pub struct RadioGroupProps {
#[props(default)]
pub children: Element,
#[props(default = false)]
pub disabled: bool,
#[props(default = RadioSize::Default)]
pub size: RadioSize,
#[props(default)]
pub text_color: Option<String>,
#[props(default)]
pub fill: Option<String>,
#[props(default)]
pub name: Option<String>,
#[props(default)]
pub on_change: Option<EventHandler<String>>,
#[props(default)]
pub class: Option<String>,
#[props(default)]
pub style: Option<String>,
}
#[component]
pub fn RadioGroup(props: RadioGroupProps) -> Element {
let mut class_names = vec!["el-radio-group".to_string()];
if props.disabled {
class_names.push("is-disabled".to_string());
}
if let Some(ref custom_class) = props.class {
class_names.push(custom_class.clone());
}
let class_string = class_names.join(" ");
let style_string = props.style.clone().unwrap_or_default();
rsx! {
div {
class: "{class_string}",
style: "{style_string}",
role: "radiogroup",
{props.children}
}
}
}
#[derive(Props, Clone, PartialEq)]
pub struct RadioButtonProps {
#[props(default)]
pub children: Option<Element>,
#[props(default)]
pub label: Option<String>,
pub value: String,
#[props(default = false)]
pub model_value: bool,
#[props(default = false)]
pub disabled: bool,
#[props(default)]
pub on_change: Option<EventHandler<String>>,
#[props(default)]
pub class: Option<String>,
#[props(default)]
pub style: Option<String>,
}
#[component]
pub fn RadioButton(props: RadioButtonProps) -> Element {
let mut class_names = vec!["el-radio-button".to_string()];
if props.model_value {
class_names.push("is-checked".to_string());
}
if props.disabled {
class_names.push("is-disabled".to_string());
}
if let Some(ref custom_class) = props.class {
class_names.push(custom_class.clone());
}
let class_string = class_names.join(" ");
let style_string = props.style.clone().unwrap_or_default();
let value_clone = props.value.clone();
rsx! {
label {
class: "{class_string}",
style: "{style_string}",
span {
class: "el-radio-button__inner",
role: "radio",
aria_checked: "{props.model_value}",
onclick: move |_| {
if !props.disabled {
if let Some(handler) = props.on_change {
handler.call(value_clone.clone());
}
}
},
if let Some(ref label) = props.label {
"{label}"
}
{props.children}
}
}
}
}