use crate::util::Color;
use yew::prelude::*;
#[derive(Clone, PartialEq, Eq)]
pub enum ButtonSize {
Large,
Normal,
Small,
}
impl Default for ButtonSize {
fn default() -> Self {
ButtonSize::Normal
}
}
pub struct Button {}
#[derive(Properties, Clone, PartialEq)]
pub struct ButtonProps {
#[prop_or_default]
pub class: String,
#[prop_or_default]
pub children: Children,
#[prop_or_default]
pub block: bool,
#[prop_or_default]
pub disabled: bool,
#[prop_or_default]
pub name: String,
#[prop_or_default]
pub onclick: Callback<MouseEvent>,
#[prop_or_default]
pub outline: bool,
#[prop_or_default]
pub size: ButtonSize,
#[prop_or(Color::Primary)]
pub style: Color,
#[prop_or_default]
pub text: String,
#[prop_or_default]
pub modal_target: Option<String>,
#[prop_or_default]
pub modal_dismiss: bool,
#[prop_or_default]
pub url: Option<AttrValue>,
#[prop_or_default]
pub target: Option<AttrValue>,
#[prop_or_default]
pub node_ref: NodeRef,
#[prop_or_default]
pub id: Option<AttrValue>,
}
impl Component for Button {
type Message = ();
type Properties = ButtonProps;
fn create(_ctx: &Context<Self>) -> Self {
Self {}
}
fn view(&self, ctx: &Context<Self>) -> Html {
let props = ctx.props();
let mut classes = Classes::new();
classes.push("btn");
if props.outline {
classes.push(format!("btn-outline-{}", props.style));
} else {
classes.push(format!("btn-{}", props.style));
}
match props.size {
ButtonSize::Large => classes.push("btn-lg"),
ButtonSize::Small => classes.push("btn-sm"),
_ => (),
}
if props.block {
classes.push("btn-block");
}
classes.push(props.class.clone());
let modal_dismiss = match props.modal_dismiss {
true => "modal",
false => "",
};
if let Some(target) = &props.modal_target {
html! {
<button
class={classes}
disabled={props.disabled}
name={props.name.clone()}
onclick={props.onclick.clone()}
data-bs-toggle="modal"
data-bs-target={format!("#{}",target.clone())}
ref={props.node_ref.clone()}
id={props.id.clone()}
>
{ &props.text }
{ for props.children.iter() }
</button>
}
} else if let Some(url) = props.url.as_ref().filter(|_| !props.disabled) {
html! {
<a
class={classes}
disabled={props.disabled}
name={props.name.clone()}
onclick={props.onclick.clone()}
data-bs-dismiss={modal_dismiss}
href={url.clone()}
target={props.target.clone()}
ref={props.node_ref.clone()}
id={props.id.clone()}
>
{ &props.text }
{ for props.children.iter() }
</a>
}
} else {
html! {
<button
class={classes}
disabled={props.disabled}
name={props.name.clone()}
onclick={props.onclick.clone()}
data-bs-dismiss={modal_dismiss}
ref={props.node_ref.clone()}
id={props.id.clone()}
>
{ &props.text }
{ for props.children.iter() }
</button>
}
}
}
}