use dioxus::prelude::*;
#[derive(Clone, PartialEq)]
pub enum TabType {
Default,
Card,
BorderCard,
}
impl TabType {
pub fn as_class(&self) -> &'static str {
match self {
TabType::Default => "",
TabType::Card => "el-tabs--card",
TabType::BorderCard => "el-tabs--border-card",
}
}
}
#[derive(Clone, PartialEq)]
pub enum TabPosition {
Top,
Right,
Bottom,
Left,
}
impl TabPosition {
pub fn as_class(&self) -> &'static str {
match self {
TabPosition::Top => "el-tabs--top",
TabPosition::Right => "el-tabs--right",
TabPosition::Bottom => "el-tabs--bottom",
TabPosition::Left => "el-tabs--left",
}
}
}
#[derive(Props, Clone, PartialEq)]
pub struct TabsProps {
#[props(default)]
pub children: Element,
#[props(default)]
pub model_value: Option<String>,
#[props(default = TabType::Default)]
pub tab_type: TabType,
#[props(default = TabPosition::Top)]
pub tab_position: TabPosition,
#[props(default = false)]
pub closable: bool,
#[props(default = false)]
pub addable: bool,
#[props(default = false)]
pub editable: bool,
#[props(default)]
pub on_tab_click: Option<EventHandler<String>>,
#[props(default)]
pub on_tab_change: Option<EventHandler<String>>,
#[props(default)]
pub on_tab_remove: Option<EventHandler<String>>,
#[props(default)]
pub class: Option<String>,
#[props(default)]
pub style: Option<String>,
}
#[component]
pub fn Tabs(props: TabsProps) -> Element {
let mut class_names = vec!["el-tabs".to_string()];
let type_class = props.tab_type.as_class();
if !type_class.is_empty() { class_names.push(type_class.to_string()); }
class_names.push(props.tab_position.as_class().to_string());
if let Some(ref c) = props.class { class_names.push(c.clone()); }
rsx! {
div {
class: "{class_names.join(\" \")}",
style: props.style.clone().unwrap_or_default(),
{props.children}
}
}
}
#[derive(Props, Clone, PartialEq)]
pub struct TabPaneProps {
#[props(default)]
pub children: Element,
pub label: String,
#[props(default)]
pub name: Option<String>,
#[props(default = false)]
pub disabled: bool,
#[props(default = false)]
pub closable: bool,
#[props(default = false)]
pub lazy: bool,
#[props(default)]
pub class: Option<String>,
#[props(default)]
pub style: Option<String>,
}
#[component]
pub fn TabPane(props: TabPaneProps) -> Element {
let mut class_names = vec!["el-tab-pane".to_string()];
if props.disabled { class_names.push("is-disabled".to_string()); }
if let Some(ref c) = props.class { class_names.push(c.clone()); }
rsx! {
div {
class: "{class_names.join(\" \")}",
style: props.style.clone().unwrap_or_default(),
role: "tabpanel",
{props.children}
}
}
}