byewlma/components/
progress.rs

1use crate::{innerlude::*, SemanticColor, Size};
2
3/// Bulma [Progress](https://bulma.io/documentation/elements/block/) Element
4pub type Progress = Pure<PureProgress>;
5
6#[derive(Debug, Default, PartialEq, Clone, Properties)]
7pub struct PureProgress {
8    #[prop_or_default]
9    pub id: Option<Cow<'static, str>>,
10
11    #[prop_or_default]
12    pub class: Classes,
13
14    #[prop_or_default]
15    pub style: Option<Cow<'static, str>>,
16
17    pub state: ProgressState,
18
19    #[prop_or_default]
20    pub size: Option<Size>,
21
22    #[prop_or_default]
23    pub color: Option<SemanticColor>,
24}
25
26#[derive(Debug, Clone, Copy, PartialEq)]
27pub enum ProgressState {
28    Indeterminate,
29    Value { value: usize, max: usize },
30}
31
32impl Default for ProgressState {
33    fn default() -> Self {
34        Self::Indeterminate
35    }
36}
37
38impl PureComponent for PureProgress {
39    fn render(&self) -> Html {
40        let mut class = self.class.clone();
41        unsafe {
42            class.unchecked_push("progress");
43        }
44
45        if let Some(size) = &self.size {
46            class.add(size);
47        }
48
49        if let Some(color) = &self.color {
50            class.add(color);
51        }
52
53        match self.state {
54            ProgressState::Indeterminate => html! {
55                <progress
56                    id={self.id.clone()}
57                    class={class}
58                    style={self.style.clone()}
59                />
60            },
61
62            ProgressState::Value { value, max } => html! {
63                <progress
64                    id={self.id.clone()}
65                    class={class}
66                    style={self.style.clone()}
67                    value={value.to_string()}
68                    max={max.to_string()}
69                >
70                    // TODO: progress as formatted percent?
71                </progress>
72            },
73        }
74    }
75}