use crate::components::form::props::InputProps;
use crate::utils::types::HTMLResult;
use crate::{rumtk_web_render_template, RUMWebTemplate};
type SelectOptions<'a> = Vec<(&'a str, &'a str)>;
#[derive(RUMWebTemplate, Debug, Clone)]
#[template(
source = "
<select size='{{ count }}' class='{{css_class}}' {{props|safe}}>
{% for (item_value, item_text) in items %}
<option value='{{item_value}}'>{{item_text}}</option>
{% endfor %}
</select>
",
ext = "html"
)]
pub struct SelectElement<'a> {
items: SelectOptions<'a>,
props: &'a str,
count: usize,
css_class: &'a str
}
fn parse_select_data(data: &str) -> Vec<(&str, &str)> {
let rows: Vec<&str> = data.split(",").collect();
let mut result: SelectOptions = vec![];
for item in rows {
let pair: Vec<&str> = item.split("=").collect();
let r = match pair.len() {
0 => {
return result;
},
1 => {
let val = pair[0];
(val, val)
},
_ => {
let val = pair[0];
let text = pair[1];
(val, text)
}
};
result.push(r);
}
result
}
pub fn select_element(_element: &str, data: &str, props: InputProps, css_class: &str) -> HTMLResult {
let items = parse_select_data(data);
let count = match props.multiple {
true => items.len(),
false => 1,
};
rumtk_web_render_template!(SelectElement {
items,
props: &props.to_string().replace("\\\\", "\\"),
count,
css_class,
})
}