use dioxus::prelude::*;
#[derive(Props, Clone, PartialEq)]
pub struct LoadingProps {
#[props(default)]
pub children: Option<Element>,
#[props(default = false)]
pub loading: bool,
#[props(default)]
pub text: Option<String>,
#[props(default = false)]
pub fullscreen: bool,
#[props(default = "rgba(255, 255, 255, 0.9)".to_string())]
pub background: String,
#[props(default)]
pub class: Option<String>,
#[props(default)]
pub style: Option<String>,
}
#[component]
pub fn Loading(props: LoadingProps) -> Element {
let mut class_names = vec!["el-loading".to_string()];
if props.fullscreen { class_names.push("el-loading--fullscreen".to_string()); }
if let Some(ref c) = props.class { class_names.push(c.clone()); }
let class_string = class_names.join(" ");
rsx! {
div {
class: "{class_string}",
style: props.style.clone().unwrap_or_default(),
{props.children}
if props.loading {
div {
class: "el-loading__mask",
style: "background-color: {props.background};",
div {
class: "el-loading__spinner",
i { class: "el-icon-loading" }
if let Some(ref text) = props.text {
p { class: "el-loading__text", "{text}" }
}
}
}
}
}
}
}
#[derive(Props, Clone, PartialEq)]
pub struct LoadingDirectiveProps {
#[props(default = false)]
pub fullscreen: bool,
#[props(default)]
pub text: Option<String>,
#[props(default)]
pub class: Option<String>,
}
#[component]
pub fn LoadingDirective(props: LoadingDirectiveProps) -> Element {
let mut class_names = vec!["el-loading".to_string()];
if props.fullscreen { class_names.push("el-loading--fullscreen".to_string()); }
if let Some(ref c) = props.class { class_names.push(c.clone()); }
rsx! {
div {
class: "{class_names.join(\" \")}",
style: "position: relative;",
div {
class: "el-loading__mask",
div {
class: "el-loading__spinner",
i { class: "el-icon-loading" }
if let Some(ref text) = props.text {
p { class: "el-loading__text", "{text}" }
}
}
}
}
}
}