pub mod classes {
pub const BASE: &str = "el-select-v2";
pub const LARGE: &str = "el-select-v2--large";
pub const SMALL: &str = "el-select-v2--small";
pub const PRIMARY: &str = "el-select-v2--primary";
pub const SUCCESS: &str = "el-select-v2--success";
pub const WARNING: &str = "el-select-v2--warning";
pub const DANGER: &str = "el-select-v2--danger";
pub const INFO: &str = "el-select-v2--info";
pub const ACTIVE: &str = "is-active";
pub const DISABLED: &str = "is-disabled";
pub const FOCUS: &str = "is-focus";
}
#[derive(Debug, Clone)]
pub struct SelectV2 {
pub id: Option<String>,
pub class: Option<String>,
pub style: Option<String>,
pub active: bool,
pub disabled: bool,
}
impl Default for SelectV2 {
fn default() -> Self {
Self {
id: None,
class: None,
style: None,
active: false,
disabled: false,
}
}
}
impl SelectV2 {
pub fn new() -> Self {
Self::default()
}
pub fn id(mut self, id: &str) -> Self {
self.id = Some(id.to_string());
self
}
pub fn class(mut self, class_name: &str) -> Self {
self.class = Some(class_name.to_string());
self
}
pub fn style(mut self, style_value: &str) -> Self {
self.style = Some(style_value.to_string());
self
}
pub fn active(mut self, active: bool) -> Self {
self.active = active;
self
}
pub fn disabled(mut self, disabled: bool) -> Self {
self.disabled = disabled;
self
}
pub fn generate_class_names(&self) -> Vec<String> {
let mut class_names = Vec::new();
class_names.push(classes::BASE.to_string());
if self.active {
class_names.push(classes::ACTIVE.to_string());
}
if self.disabled {
class_names.push(classes::DISABLED.to_string());
}
if let Some(ref custom_class) = self.class {
class_names.push(custom_class.to_string());
}
class_names
}
pub fn get_html_info(&self) -> ComponentInfo {
ComponentInfo {
component_type: "select-v2".to_string(),
class_names: self.generate_class_names(),
id: self.id.clone(),
style: self.style.clone(),
}
}
}
#[derive(Debug, Clone)]
pub struct ComponentInfo {
pub component_type: String,
pub class_names: Vec<String>,
pub id: Option<String>,
pub style: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_select_v2_creation() {
let component = SelectV2::new()
.id("test-select-v2")
.class("custom-select-v2-class");
assert_eq!(component.id.as_ref().unwrap(), "test-select-v2");
assert_eq!(component.class.as_ref().unwrap(), "custom-select-v2-class");
assert_eq!(component.active, false);
assert_eq!(component.disabled, false);
}
#[test]
fn test_select_v2_class_generation() {
let component = SelectV2::new()
.active(true)
.disabled(false)
.class("extra-class");
let class_names = component.generate_class_names();
assert!(class_names.contains(&classes::BASE.to_string()));
assert!(class_names.contains(&classes::ACTIVE.to_string()));
assert!(!class_names.contains(&classes::DISABLED.to_string()));
assert!(class_names.contains(&"extra-class".to_string()));
}
#[test]
fn test_select_v2_states() {
let active_disabled = SelectV2::new()
.active(true)
.disabled(true);
let class_names = active_disabled.generate_class_names();
assert!(class_names.contains(&classes::ACTIVE.to_string()));
assert!(class_names.contains(&classes::DISABLED.to_string()));
}
}