yew_bootstrap/component/
progress.rs1use yew::prelude::*;
2use gloo_console::warn;
3
4use crate::util::Color;
5
6#[derive(Properties, Clone, PartialEq)]
42pub struct ProgressProps {
43 #[prop_or_default]
44 pub children: Children,
45
46 #[prop_or_default]
48 pub class: Classes,
49
50 #[prop_or(None)]
52 pub height: Option<i32>,
53}
54
55#[derive(Properties, Clone, PartialEq)]
57pub struct ProgressBarProps {
58 #[prop_or_default]
60 pub style: Option<Color>,
61
62 pub value: i32,
64
65 #[prop_or(0)]
67 pub min: i32,
68
69 #[prop_or(100)]
71 pub max: i32,
72
73 #[prop_or_default]
75 pub striped: bool,
76
77 #[prop_or_default]
79 pub animated: bool,
80
81 #[prop_or_default]
83 pub label: AttrValue,
84
85 #[prop_or_default]
87 pub class: Classes,
88}
89
90
91#[function_component]
93pub fn Progress(props: &ProgressProps) -> Html {
94 let height = props.height.map(|val| format!("height: {val}px;"));
95
96 html! {
97 <div class={classes!("progress", props.class.clone())} style={height} >
98 { for props.children.iter() }
99 </div>
100 }
101}
102
103#[function_component]
105pub fn ProgressBar(props: &ProgressBarProps) -> Html {
106 if props.min >= props.max {
107 warn!(format!("ProgressBar: min ({}) needs to be less than max ({})", props.min, props.max));
108 }
109
110 if props.value < props.min || props.value > props.max {
111 warn!(format!("ProgressBar: value is {}, should be between {} and {}", props.value, props.min, props.max));
112 }
113
114 let width = if props.min < props.max { 100 * (props.value - props.min) / (props.max - props.min) } else { props.min };
115 let width = format!("width: {width}%;");
116
117 let mut progress_classes = props.class.clone();
118 if let Some(color) = &props.style {
119 progress_classes.push(format!("bg-{color}"))
120 }
121 if props.striped || props.animated {
122 progress_classes.push("progress-bar-striped")
123 }
124 if props.animated {
125 progress_classes.push("progress-bar-animated")
126 }
127
128 html! {
129 <div
130 class={classes!("progress-bar", progress_classes)}
131 role={"progressbar"}
132 style={width}
133 aria-valuenow={props.value.to_string()}
134 aria-valuemin={props.min.to_string()}
135 aria-valuemax={props.max.to_string()}
136 >
137 {props.label.clone()}
138 </div>
139 }
140}