windjammer_ui/components/generated/
select.rs

1#![allow(clippy::all)]
2#![allow(noop_method_call)]
3pub struct Select {
4    options: Vec<SelectOption>,
5    selected: String,
6    placeholder: String,
7    disabled: bool,
8    size: SelectSize,
9    class: String,
10}
11
12pub struct SelectOption {
13    value: String,
14    label: String,
15}
16
17pub enum SelectSize {
18    Small,
19    Medium,
20    Large,
21}
22
23impl Select {
24    #[inline]
25    pub fn new() -> Select {
26        Select {
27            options: Vec::new(),
28            selected: String::new(),
29            placeholder: "Select an option".to_string(),
30            disabled: false,
31            size: SelectSize::Medium,
32            class: String::new(),
33        }
34    }
35    #[inline]
36    pub fn option(mut self, value: String, label: String) -> Select {
37        self.options.push(SelectOption { value, label });
38        self
39    }
40    #[inline]
41    pub fn selected(mut self, selected: String) -> Select {
42        self.selected = selected;
43        self
44    }
45    #[inline]
46    pub fn placeholder(mut self, placeholder: String) -> Select {
47        self.placeholder = placeholder;
48        self
49    }
50    #[inline]
51    pub fn disabled(mut self, disabled: bool) -> Select {
52        self.disabled = disabled;
53        self
54    }
55    #[inline]
56    pub fn size(mut self, size: SelectSize) -> Select {
57        self.size = size;
58        self
59    }
60    #[inline]
61    pub fn class(mut self, class: String) -> Select {
62        self.class = class;
63        self
64    }
65    pub fn render(&self) -> String {
66        let size_style = match self.size {
67            SelectSize::Small => "padding: 4px 8px; font-size: 12px;",
68            SelectSize::Medium => "padding: 8px 12px; font-size: 14px;",
69            SelectSize::Large => "padding: 12px 16px; font-size: 16px;",
70        };
71        let disabled_attr = {
72            if self.disabled {
73                " disabled"
74            } else {
75                ""
76            }
77        };
78        let mut html = String::new();
79        html.push_str("<select class=\"wj-select ");
80        html.push_str(self.class.as_str());
81        html.push_str("\" style=\"");
82        html.push_str(size_style);
83        html.push_str(
84            " border: 1px solid #d1d5db; border-radius: 6px; background: white; cursor: pointer;\"",
85        );
86        html.push_str(disabled_attr);
87        html.push('>');
88        if !self.placeholder.is_empty() {
89            html.push_str("<option value=\"\" disabled");
90            if self.selected.is_empty() {
91                html.push_str(" selected")
92            }
93            html.push_str(">");
94            html.push_str(self.placeholder.as_str());
95            html.push_str("</option>")
96        }
97        for opt in self.options.iter() {
98            html.push_str("<option value=\"");
99            html.push_str(opt.value.as_str());
100            html.push('"');
101            if opt.value == self.selected {
102                html.push_str(" selected")
103            }
104            html.push('>');
105            html.push_str(opt.label.as_str());
106            html.push_str("</option>");
107        }
108        html.push_str("</select>");
109        html
110    }
111}