windjammer_ui/components/generated/
sidebar.rs

1#![allow(clippy::all)]
2#![allow(noop_method_call)]
3use super::traits::Renderable;
4
5pub enum SidebarPosition {
6    Left,
7    Right,
8}
9
10pub struct SidebarItem {
11    label: String,
12    icon: String,
13    href: String,
14}
15
16impl SidebarItem {
17    #[inline]
18    pub fn new(label: String) -> SidebarItem {
19        SidebarItem {
20            label,
21            icon: String::from("".to_string()),
22            href: String::from("#".to_string()),
23        }
24    }
25    #[inline]
26    pub fn icon(mut self, icon: String) -> SidebarItem {
27        self.icon = icon;
28        self
29    }
30    #[inline]
31    pub fn href(mut self, href: String) -> SidebarItem {
32        self.href = href;
33        self
34    }
35}
36
37pub struct Sidebar {
38    items: Vec<SidebarItem>,
39    position: SidebarPosition,
40    width: String,
41    collapsed: bool,
42}
43
44impl Sidebar {
45    #[inline]
46    pub fn new() -> Sidebar {
47        Sidebar {
48            items: Vec::new(),
49            position: SidebarPosition::Left,
50            width: String::from("250px".to_string()),
51            collapsed: false,
52        }
53    }
54    #[inline]
55    pub fn item(mut self, item: SidebarItem) -> Sidebar {
56        self.items.push(item);
57        self
58    }
59    #[inline]
60    pub fn position(mut self, pos: SidebarPosition) -> Sidebar {
61        self.position = pos;
62        self
63    }
64    #[inline]
65    pub fn width(mut self, width: String) -> Sidebar {
66        self.width = width;
67        self
68    }
69    #[inline]
70    pub fn collapsed(mut self, collapsed: bool) -> Sidebar {
71        self.collapsed = collapsed;
72        self
73    }
74}
75
76impl Renderable for Sidebar {
77    #[inline]
78    fn render(self) -> String {
79        let mut items_html = Vec::new();
80        for item in &self.items {
81            let icon_html = {
82                if item.icon.len() > 0 {
83                    format!("<span class='wj-sidebar-icon'>{}</span>", item.icon)
84                } else {
85                    String::from("".to_string())
86                }
87            };
88            items_html.push(format!("<a href='{}' class='wj-sidebar-item'>{}<span class='wj-sidebar-label'>{}</span></a>", item.href, icon_html, item.label));
89        }
90        let position_class = match self.position {
91            SidebarPosition::Left => "wj-sidebar-left",
92            SidebarPosition::Right => "wj-sidebar-right",
93        };
94        let collapsed_class = {
95            if self.collapsed {
96                " wj-sidebar-collapsed"
97            } else {
98                ""
99            }
100        };
101        format!("<aside class='wj-sidebar {} {}' style='width: {}'>
102                <div class='wj-sidebar-toggle' onclick='this.parentElement.classList.toggle(\"wj-sidebar-collapsed\")'>
103                    <span class='wj-sidebar-toggle-icon'>☰</span>
104                </div>
105                <nav class='wj-sidebar-nav'>{}</nav>
106            </aside>", position_class, collapsed_class, self.width, items_html.join(""))
107    }
108}