[Racket] Ferti hydroponic nutrient solver, redux.
Break up ferti page components.
views.rkt
@@ -84,80 +84,80 @@
84
84
85
85
;; Pages
86
86
87
Removed:
(define (ferti-page ferti-recipe latest-measurement-hash latest-target-hash measurements)
87
Added:
(define (ferti-page fertilizer-recipe latest-measurement-hash latest-target-hash measurements)
88
88
(page-template
89
89
"Ferti"
90
90
`((h1 ((class "display-1 mb-3")) "Ferti")
91
Removed:
;;;;;;;;
92
Removed:
;; Ferti
93
Removed:
;;;;;;;;
94
Removed:
(h2 () "Recette")
95
Removed:
,(if (ormap (λ (pair) (not (zero? (cdr pair)))) ferti-recipe)
96
Removed:
`(table ((class "table"))
97
Removed:
(tr (th "Intrant") (th ((class "text-end")) "Quantité (g/L)"))
98
Removed:
,@(for/list ([fertilizer-amount ferti-recipe]
99
Removed:
#:when (not (zero? (cdr fertilizer-amount))))
100
Removed:
(match-define (cons fertilizer amount) fertilizer-amount)
101
Removed:
`(tr (td () ,(fertilizer-name fertilizer))
102
Removed:
(td ((class "text-end font-monospace")) ,(round 2 amount)))))
103
Removed:
`(p "La recette Ferti requiert au moins un relevé et une cible."))
104
Removed:
;;;;;;;;;
105
Removed:
;; Cibles
106
Removed:
;;;;;;;;;
107
Removed:
(h2 () "Dernière Cible")
108
Removed:
(a ((class "btn btn-primary mb-3") [href "/target/new"]) "Créer une cible")
109
Removed:
(table ((class "table"))
110
Removed:
(tr (th "Nutriment")
111
Removed:
(th ((class "text-end")) "Dernier Relevé")
112
Removed:
(th ((class "text-end")) "Dernière Cible")
113
Removed:
(th ((class "text-end")) "Delta (%)"))
114
Removed:
,@(for/list ([n (get-nutrients)])
115
Removed:
(define latest-measurement (hash-ref latest-measurement-hash n #f))
116
Removed:
(define latest-target (hash-ref latest-target-hash n #f))
117
Removed:
(define delta-percentage
118
Removed:
(cond
119
Removed:
[(false? latest-target) #f]
120
Removed:
[(zero? latest-target) -100]
121
Removed:
[(zero? latest-measurement) 100]
122
Removed:
[(number? latest-target)
123
Removed:
(* 100 (/ (- latest-target latest-measurement) latest-measurement))]))
124
Removed:
`(tr (td ,(nutrient-name n))
125
Removed:
(td ((class "text-end font-monospace"))
126
Removed:
,(if latest-measurement
127
Removed:
(round 2 latest-measurement)
128
Removed:
"—"))
129
Removed:
(td ((class "text-end font-monospace"))
130
Removed:
,(if latest-target
131
Removed:
(round 2 latest-target)
132
Removed:
"—"))
133
Removed:
(td ((class "text-end font-monospace"))
134
Removed:
,(if delta-percentage
135
Removed:
(round 1 delta-percentage)
136
Removed:
"—")))))
137
Removed:
;;;;;;;;;;
138
Removed:
;; Relevés
139
Removed:
;;;;;;;;;;
140
Removed:
(h2 () "Relevés")
141
Removed:
(a ((class "btn btn-primary mb-3") [href "/measurement/new"]) "Ajouter un relevé")
142
Removed:
(table ((class "table table-striped"))
143
Removed:
(tr (th "Date")
144
Removed:
(th ((class "text-end")) "N")
145
Removed:
(th ((class "text-end")) "P")
146
Removed:
(th ((class "text-end")) "K"))
147
Removed:
,@(for/list ([m measurements])
148
Removed:
(define measured-on (nutrient-measurement-date m))
149
Removed:
(define-values (n p k)
150
Removed:
(apply values
151
Removed:
(for/list ([nutrient '("Nitrate Nitrogen" "Phosphorus" "Potassium")])
152
Removed:
(define n (get-nutrient #:name nutrient))
153
Removed:
(define mnv (get-nutrient-measurement-value m n))
154
Removed:
(if (real? mnv)
155
Removed:
(round 2 mnv)
156
Removed:
"—"))))
157
Removed:
`(tr (td ,measured-on)
158
Removed:
(td ((class "text-end font-monospace")) ,n)
159
Removed:
(td ((class "text-end font-monospace")) ,p)
160
Removed:
(td ((class "text-end font-monospace")) ,k)))))))
91
Added:
,@(ferti-recipe fertilizer-recipe)
92
Added:
,@(ferti-targets latest-measurement-hash latest-target-hash)
93
Added:
,@(ferti-measurements measurements))))
94
Added:
95
Added:
(define (ferti-recipe ferti-recipe)
96
Added:
`((h2 () "Recette")
97
Added:
,(if (ormap (λ (pair) (not (zero? (cdr pair)))) ferti-recipe)
98
Added:
`(table ((class "table"))
99
Added:
(tr (th "Intrant") (th ((class "text-end")) "Quantité (g/L)"))
100
Added:
,@(for/list ([fertilizer-amount ferti-recipe]
101
Added:
#:when (not (zero? (cdr fertilizer-amount))))
102
Added:
(match-define (cons fertilizer amount) fertilizer-amount)
103
Added:
`(tr (td () ,(fertilizer-name fertilizer))
104
Added:
(td ((class "text-end font-monospace")) ,(round 2 amount)))))
105
Added:
`(p "La recette Ferti requiert au moins un relevé et une cible."))))
106
Added:
107
Added:
(define (ferti-targets latest-measurement-hash latest-target-hash)
108
Added:
`((h2 () "Dernière Cible")
109
Added:
(a ((class "btn btn-primary mb-3") [href "/target/new"]) "Créer une cible")
110
Added:
(table ((class "table"))
111
Added:
(tr (th "Nutriment")
112
Added:
(th ((class "text-end")) "Dernier Relevé")
113
Added:
(th ((class "text-end")) "Dernière Cible")
114
Added:
(th ((class "text-end")) "Delta (%)"))
115
Added:
,@(for/list ([n (get-nutrients)])
116
Added:
(define latest-measurement (hash-ref latest-measurement-hash n #f))
117
Added:
(define latest-target (hash-ref latest-target-hash n #f))
118
Added:
(define delta-percentage
119
Added:
(cond
120
Added:
[(false? latest-target) #f]
121
Added:
[(zero? latest-target) -100]
122
Added:
[(zero? latest-measurement) 100]
123
Added:
[(number? latest-target)
124
Added:
(* 100 (/ (- latest-target latest-measurement) latest-measurement))]))
125
Added:
`(tr (td ,(nutrient-name n))
126
Added:
(td ((class "text-end font-monospace"))
127
Added:
,(if latest-measurement
128
Added:
(round 2 latest-measurement)
129
Added:
"—"))
130
Added:
(td ((class "text-end font-monospace"))
131
Added:
,(if latest-target
132
Added:
(round 2 latest-target)
133
Added:
"—"))
134
Added:
(td ((class "text-end font-monospace"))
135
Added:
,(if delta-percentage
136
Added:
(round 1 delta-percentage)
137
Added:
"—")))))))
138
Added:
139
Added:
(define (ferti-measurements measurements)
140
Added:
`((h2 () "Relevés")
141
Added:
(a ((class "btn btn-primary mb-3") [href "/measurement/new"]) "Ajouter un relevé")
142
Added:
(table ((class "table table-striped"))
143
Added:
(tr (th "Date")
144
Added:
(th ((class "text-end")) "N")
145
Added:
(th ((class "text-end")) "P")
146
Added:
(th ((class "text-end")) "K"))
147
Added:
,@(for/list ([m measurements])
148
Added:
(define measured-on (nutrient-measurement-date m))
149
Added:
(define-values (n p k)
150
Added:
(apply values
151
Added:
(for/list ([nutrient '("Nitrate Nitrogen" "Phosphorus" "Potassium")])
152
Added:
(define n (get-nutrient #:name nutrient))
153
Added:
(define mnv (get-nutrient-measurement-value m n))
154
Added:
(if (real? mnv)
155
Added:
(round 2 mnv)
156
Added:
"—"))))
157
Added:
`(tr (td ,measured-on)
158
Added:
(td ((class "text-end font-monospace")) ,n)
159
Added:
(td ((class "text-end font-monospace")) ,p)
160
Added:
(td ((class "text-end font-monospace")) ,k))))))
161
161
162
162
(define (new-measurement-page)
163
163
(page-template "Nouveau relevé"