use yew::prelude::*;
use gloo_console::warn;
use crate::util::Color;
#[derive(Properties, Clone, PartialEq)]
pub struct ProgressProps {
#[prop_or_default]
pub children: Children,
#[prop_or_default]
pub class: Classes,
#[prop_or(None)]
pub height: Option<i32>,
}
#[derive(Properties, Clone, PartialEq)]
pub struct ProgressBarProps {
#[prop_or_default]
pub style: Option<Color>,
pub value: i32,
#[prop_or(0)]
pub min: i32,
#[prop_or(100)]
pub max: i32,
#[prop_or_default]
pub striped: bool,
#[prop_or_default]
pub animated: bool,
#[prop_or_default]
pub label: AttrValue,
#[prop_or_default]
pub class: Classes,
}
#[function_component]
pub fn Progress(props: &ProgressProps) -> Html {
let height = props.height.map(|val| format!("height: {val}px;"));
html! {
<div class={classes!("progress", props.class.clone())} style={height} >
{ for props.children.iter() }
</div>
}
}
#[function_component]
pub fn ProgressBar(props: &ProgressBarProps) -> Html {
if props.min >= props.max {
warn!(format!("ProgressBar: min ({}) needs to be less than max ({})", props.min, props.max));
}
if props.value < props.min || props.value > props.max {
warn!(format!("ProgressBar: value is {}, should be between {} and {}", props.value, props.min, props.max));
}
let width = if props.min < props.max { 100 * (props.value - props.min) / (props.max - props.min) } else { props.min };
let width = format!("width: {width}%;");
let mut progress_classes = props.class.clone();
if let Some(color) = &props.style {
progress_classes.push(format!("bg-{color}"))
}
if props.striped || props.animated {
progress_classes.push("progress-bar-striped")
}
if props.animated {
progress_classes.push("progress-bar-animated")
}
html! {
<div
class={classes!("progress-bar", progress_classes)}
role={"progressbar"}
style={width}
aria-valuenow={props.value.to_string()}
aria-valuemin={props.min.to_string()}
aria-valuemax={props.max.to_string()}
>
{props.label.clone()}
</div>
}
}