use dioxus::prelude::*;
use crate::types::Color;
#[derive(Clone, PartialEq, Props)]
pub struct ListGroupProps {
#[props(default)]
pub flush: bool,
#[props(default)]
pub numbered: bool,
#[props(default)]
pub class: String,
#[props(extends = GlobalAttributes)]
attributes: Vec<Attribute>,
pub children: Element,
}
#[component]
pub fn ListGroup(props: ListGroupProps) -> Element {
let mut classes = vec!["list-group".to_string()];
if props.flush {
classes.push("list-group-flush".to_string());
}
if props.numbered {
classes.push("list-group-numbered".to_string());
}
if !props.class.is_empty() {
classes.push(props.class.clone());
}
let full_class = classes.join(" ");
if props.numbered {
rsx! {
ol { class: "{full_class}", ..props.attributes, {props.children} }
}
} else {
rsx! {
ul { class: "{full_class}", ..props.attributes, {props.children} }
}
}
}
#[derive(Clone, PartialEq, Props)]
pub struct ListGroupItemProps {
#[props(default)]
pub active: bool,
#[props(default)]
pub disabled: bool,
#[props(default)]
pub color: Option<Color>,
#[props(default)]
pub onclick: Option<EventHandler<MouseEvent>>,
#[props(default)]
pub class: String,
#[props(extends = GlobalAttributes)]
attributes: Vec<Attribute>,
pub children: Element,
}
#[component]
pub fn ListGroupItem(props: ListGroupItemProps) -> Element {
let mut classes = vec!["list-group-item".to_string()];
if props.active {
classes.push("active".to_string());
}
if props.disabled {
classes.push("disabled".to_string());
}
if let Some(ref c) = props.color {
classes.push(format!("list-group-item-{c}"));
}
if props.onclick.is_some() {
classes.push("list-group-item-action".to_string());
}
if !props.class.is_empty() {
classes.push(props.class.clone());
}
let full_class = classes.join(" ");
if let Some(handler) = &props.onclick {
let handler = *handler;
rsx! {
button {
class: "{full_class}",
r#type: "button",
disabled: props.disabled,
onclick: move |evt| handler.call(evt),
..props.attributes,
{props.children}
}
}
} else {
rsx! {
li { class: "{full_class}", ..props.attributes, {props.children} }
}
}
}