1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
//! Sensor page.

use crate::reading::Reading;
use crate::templates;
use crate::templates::DATE_FORMAT;
use crate::value::Value;
use chrono::{DateTime, Local};
use serde_json::json;

markup::define! {
    Sensor(last: Reading, readings: Vec<Reading>) {
        section.hero.{&last.value.class()} {
            div."hero-head" { {templates::navbar::NavBar {}} }
            div."hero-body" {
                div.container {
                    h1.title."is-4"[title = {format!("{:?}", &last.value)}] {
                        @if last.value.is_inline() {
                            {&last.value}
                        } else {
                            {&last.sensor}
                        }
                    }
                    h2.subtitle."is-6" {
                        @if last.value.is_inline() {
                            {&last.sensor} " "
                        }
                        span { i.far."fa-clock" {} } " "
                        span[title = {&last.timestamp.to_string()}] {
                            {&last.timestamp.format(DATE_FORMAT).to_string()}
                        }
                    }
                }
            }
        }

        @if !last.value.is_inline() {
            section.section {
                div.container {
                    div.message {
                        div."message-body" {
                            {&last.value}
                        }
                    }
                }
            }
        }

        section.section {
            div.container {
                h3.title."is-5" { "Latest reading" }
                h4.subtitle."is-7" { "This is what is stored in the database" }
                div.message {
                    div."message-body" {
                        pre {
                            code {
                                {format!("{:#?}", &last)}
                            }
                        }
                    }
                }
            }
        }

        section.section {
            div.container {
                h3.title."is-5" { "JSON" }
                div.message {
                    div."message-body" {
                        pre {
                            code {
                                {
                                    let (xs, ys): (Vec<DateTime<Local>>, Vec<Value>) = readings
                                        .iter()
                                        .map(|reading| (reading.timestamp, reading.value.clone()))
                                        .unzip();
                                }
                                {
                                    serde_json::to_string(&json!({
                                        "x": xs,
                                        "y": ys,
                                    })).unwrap()
                                }
                            }
                        }
                    }
                }
            }
        }

        section.section {
            div.container {
                h3.title."is-5" { "Danger zone" }

                div.message."is-danger" {
                    div."message-body" {
                        div.content {
                            p {
                                "All readings from this sensor will get the specified sensor."
                            }
                            p {
                                "You may need that if you renamed a service and you want to move old readings to the new sensor."
                            }
                        }

                        form {
                            div.field."has-addons" {
                                div.control."is-expanded" {
                                    input[class = "input", type = "text", value = {&last.sensor}, placeholder = "Sensor"];
                                }
                                div.control {
                                    a.button."is-danger" { "Rename" }
                                }
                            }
                        }
                    }
                }

                div.message."is-danger" {
                    div."message-body" {
                        div.content {
                            p {
                                "This will " strong { "permanently delete" } " all the sensor readings."
                            }
                        }

                        form {
                            div.field {
                                div.control {
                                    button.button."is-danger" { "Delete" }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}