windjammer_ui/components/generated/
panel.rs

1#![allow(clippy::all)]
2#![allow(noop_method_call)]
3use super::traits::Renderable;
4
5pub struct Panel {
6    title: String,
7    children: Vec<String>,
8    collapsible: bool,
9    collapsed: bool,
10    padding: String,
11}
12
13impl Panel {
14    #[inline]
15    pub fn new(title: String) -> Panel {
16        Panel {
17            title,
18            children: Vec::new(),
19            collapsible: false,
20            collapsed: false,
21            padding: "16px".to_string(),
22        }
23    }
24    #[inline]
25    pub fn child(mut self, child: String) -> Panel {
26        self.children.push(child);
27        self
28    }
29    #[inline]
30    pub fn collapsible(mut self, collapsible: bool) -> Panel {
31        self.collapsible = collapsible;
32        self
33    }
34    #[inline]
35    pub fn collapsed(mut self, collapsed: bool) -> Panel {
36        self.collapsed = collapsed;
37        self
38    }
39    #[inline]
40    pub fn padding(mut self, padding: String) -> Panel {
41        self.padding = padding;
42        self
43    }
44}
45
46impl Renderable for Panel {
47    #[inline]
48    fn render(self) -> String {
49        let header_class = {
50            if self.collapsible {
51                "wj-panel-header-collapsible"
52            } else {
53                "wj-panel-header"
54            }
55        };
56        let icon = {
57            if self.collapsible {
58                if self.collapsed {
59                    "▶"
60                } else {
61                    "▼"
62                }
63            } else {
64                ""
65            }
66        };
67        let content_style = {
68            if self.collapsed {
69                "display: none;"
70            } else {
71                "display: block;"
72            }
73        };
74        let children_html = self.children.join(
75            "
76",
77        );
78        format!(
79            "<div class='wj-panel'>
80  <div class='{}'>
81    <span>{}</span>
82    <h3>{}</h3>
83  </div>
84  <div class='wj-panel-content' style='{}padding: {};'>
85    {}
86  </div>
87</div>",
88            header_class, icon, self.title, content_style, self.padding, children_html
89        )
90    }
91}