Skip to main content

dioxus_element_plug/components/
descriptions.rs

1use dioxus::prelude::*;
2
3/// Descriptions direction
4#[derive(Clone, PartialEq)]
5pub enum DescriptionsDirection {
6    Horizontal,
7    Vertical,
8}
9
10/// Descriptions border
11#[derive(Clone, PartialEq)]
12pub enum DescriptionsBorder {
13    None,
14    Default,
15    Always,
16}
17
18/// Descriptions props
19#[derive(Props, Clone, PartialEq)]
20pub struct DescriptionsProps {
21    #[props(default)]
22    pub children: Element,
23
24    #[props(default)]
25    pub title: Option<String>,
26
27    #[props(default = "default".to_string())]
28    pub size: String,
29
30    #[props(default = 3)]
31    pub column: u32,
32
33    #[props(default = DescriptionsDirection::Horizontal)]
34    pub direction: DescriptionsDirection,
35
36    #[props(default = false)]
37    pub border: bool,
38
39    #[props(default)]
40    pub class: Option<String>,
41
42    #[props(default)]
43    pub style: Option<String>,
44}
45
46/// Descriptions component for displaying detail information
47#[component]
48pub fn Descriptions(props: DescriptionsProps) -> Element {
49    let mut class_names = vec!["el-descriptions".to_string()];
50    if props.border { class_names.push("is-bordered".to_string()); }
51    class_names.push(format!("el-descriptions--{}", props.size));
52    if let Some(ref c) = props.class { class_names.push(c.clone()); }
53
54    rsx! {
55        div {
56            class: "{class_names.join(\" \")}",
57            style: props.style.clone().unwrap_or_default(),
58            if let Some(ref title) = props.title {
59                div {
60                    class: "el-descriptions__header",
61                    div { class: "el-descriptions__title", "{title}" }
62                }
63            }
64            div {
65                class: "el-descriptions__body",
66                {props.children}
67            }
68        }
69    }
70}