dioxus_element_plug/components/
collapse.rs1use dioxus::prelude::*;
2
3#[derive(Props, Clone, PartialEq)]
5pub struct CollapseProps {
6 #[props(default)]
7 pub children: Element,
8
9 #[props(default)]
11 pub active_names: Vec<String>,
12
13 #[props(default = false)]
15 pub accordion: bool,
16
17 #[props(default)]
18 pub on_change: Option<EventHandler<Vec<String>>>,
19
20 #[props(default)]
21 pub class: Option<String>,
22
23 #[props(default)]
24 pub style: Option<String>,
25}
26
27#[component]
29pub fn Collapse(props: CollapseProps) -> Element {
30 let mut class_names = vec!["el-collapse".to_string()];
31 if let Some(ref c) = props.class { class_names.push(c.clone()); }
32 let class_string = class_names.join(" ");
33
34 rsx! {
35 div {
36 class: "{class_string}",
37 style: props.style.clone().unwrap_or_default(),
38 role: "tablist",
39 {props.children}
40 }
41 }
42}
43
44#[derive(Props, Clone, PartialEq)]
46pub struct CollapseItemProps {
47 #[props(default)]
48 pub children: Element,
49
50 pub name: String,
52
53 pub title: String,
55
56 #[props(default = false)]
58 pub disabled: bool,
59
60 #[props(default)]
61 pub on_click: Option<EventHandler<String>>,
62
63 #[props(default)]
64 pub class: Option<String>,
65
66 #[props(default)]
67 pub style: Option<String>,
68}
69
70#[component]
72pub fn CollapseItem(props: CollapseItemProps) -> Element {
73 let name_clone = props.name.clone();
74 rsx! {
75 div {
76 class: "el-collapse-item",
77 style: props.style.clone().unwrap_or_default(),
78 div {
79 class: "el-collapse-item__header",
80 role: "tab",
81 onclick: move |_| {
82 if !props.disabled {
83 if let Some(handler) = props.on_click {
84 handler.call(name_clone.clone());
85 }
86 }
87 },
88 "{props.title}"
89 i { class: "el-collapse-item__arrow el-icon-arrow-right" }
90 }
91 div {
92 class: "el-collapse-item__wrap",
93 div {
94 class: "el-collapse-item__content",
95 {props.children}
96 }
97 }
98 }
99 }
100}