dioxus_bootstrap_css/
list_group.rs1use dioxus::prelude::*;
2
3use crate::types::Color;
4
5#[derive(Clone, PartialEq, Props)]
39pub struct ListGroupProps {
40 #[props(default)]
42 pub flush: bool,
43 #[props(default)]
45 pub numbered: bool,
46 #[props(default)]
48 pub class: String,
49 pub children: Element,
51}
52
53#[component]
54pub fn ListGroup(props: ListGroupProps) -> Element {
55 let mut classes = vec!["list-group".to_string()];
56 if props.flush {
57 classes.push("list-group-flush".to_string());
58 }
59 if props.numbered {
60 classes.push("list-group-numbered".to_string());
61 }
62 if !props.class.is_empty() {
63 classes.push(props.class.clone());
64 }
65 let full_class = classes.join(" ");
66
67 if props.numbered {
68 rsx! {
69 ol { class: "{full_class}", {props.children} }
70 }
71 } else {
72 rsx! {
73 ul { class: "{full_class}", {props.children} }
74 }
75 }
76}
77
78#[derive(Clone, PartialEq, Props)]
80pub struct ListGroupItemProps {
81 #[props(default)]
83 pub active: bool,
84 #[props(default)]
86 pub disabled: bool,
87 #[props(default)]
89 pub color: Option<Color>,
90 #[props(default)]
92 pub onclick: Option<EventHandler<MouseEvent>>,
93 #[props(default)]
95 pub class: String,
96 pub children: Element,
98}
99
100#[component]
101pub fn ListGroupItem(props: ListGroupItemProps) -> Element {
102 let mut classes = vec!["list-group-item".to_string()];
103 if props.active {
104 classes.push("active".to_string());
105 }
106 if props.disabled {
107 classes.push("disabled".to_string());
108 }
109 if let Some(ref c) = props.color {
110 classes.push(format!("list-group-item-{c}"));
111 }
112 if props.onclick.is_some() {
113 classes.push("list-group-item-action".to_string());
114 }
115 if !props.class.is_empty() {
116 classes.push(props.class.clone());
117 }
118 let full_class = classes.join(" ");
119
120 if let Some(handler) = &props.onclick {
121 let handler = *handler;
122 rsx! {
123 button {
124 class: "{full_class}",
125 r#type: "button",
126 disabled: props.disabled,
127 onclick: move |evt| handler.call(evt),
128 {props.children}
129 }
130 }
131 } else {
132 rsx! {
133 li { class: "{full_class}", {props.children} }
134 }
135 }
136}