[Racket] Ferti hydroponic nutrient solver, redux.
Add ferti recipe table to the index page.
Changed files
handlers.rkt
@@ -9,7 +9,8 @@
9
9
"formlets.rkt"
10
10
"models/nutrient-measurement.rkt"
11
11
"models/nutrient-target.rkt"
12
Removed:
"models/crop-requirement.rkt")
12
Added:
"models/crop-requirement.rkt"
13
Added:
"services/nnls.rkt")
13
14
14
15
(define-values (app-dispatch _)
15
16
(dispatch-rules
@@ -26,9 +27,10 @@
26
27
27
28
(define (index _)
28
29
(define measurements (get-nutrient-measurements))
30
Added:
(define ferti-recipe (find-ferti-recipe))
29
31
(response/xexpr
30
32
#:preamble #"<!DOCTYPE html>"
31
Removed:
(index-page measurements)))
33
Added:
(index-page measurements ferti-recipe)))
32
34
33
35
34
36
;; Nutrient measurements
models/fertilizer-product.rkt
@@ -4,9 +4,11 @@
4
4
;; Struct definitions
5
5
fertilizer-product
6
6
fertilizer-product?
7
Removed:
fertilizer-product-id fertilizer-product-brand-name
7
Added:
fertilizer-product-id
8
8
(rename-out
9
Removed:
[fertilizer-product-nutrient-values fertilizer-product-values])
9
Added:
[fertilizer-product-canonical-name fertilizer-name]
10
Added:
[fertilizer-product-nutrient-values fertilizer-product-values]
11
Added:
[fertilizer-product-brand-name fertilizer-brand-name])
10
12
;; SQL CRUD
11
13
(contract-out
12
14
[create-fertilizer-product! (->* (string?
@@ -167,11 +169,10 @@
167
169
(acc canonical-name
168
170
brand-name
169
171
(list nv-pair)))))
170
Removed:
(and A
171
Removed:
(fertilizer-product the-id
172
Removed:
(acc-canonical-name A)
173
Removed:
(reverse (acc-pairs A))
174
Removed:
(acc-brand-name A)))]))
172
Added:
(fertilizer-product the-id
173
Added:
(acc-canonical-name A)
174
Added:
(reverse (acc-pairs A))
175
Added:
(acc-brand-name A))]))
175
176
176
177
(define (get-fertilizer-product-values fertilizer-product)
177
178
(for/list ([(nutrient-id name formula value_ppm)
views.rkt
@@ -9,7 +9,8 @@
9
9
"formlets.rkt"
10
10
"models/nutrient.rkt"
11
11
"models/nutrient-measurement.rkt"
12
Removed:
"models/nutrient-target.rkt")
12
Added:
"models/nutrient-target.rkt"
13
Added:
"models/fertilizer-product.rkt")
13
14
14
15
15
16
(define (page-template title body-xexpr)
@@ -67,15 +68,37 @@
67
68
;; Page helpers
68
69
69
70
(define (round n number)
70
Removed:
(~r number #:precision n))
71
Added:
(~r number #:precision `(= ,n)))
71
72
72
73
73
74
;; Pages
74
75
75
Removed:
(define (index-page measurements)
76
Added:
(define (index-page measurements ferti-recipe)
76
77
(page-template
77
78
"Ferti"
78
79
`((h1 ([class "display-1 mb-3"]) "Ferti")
80
Added:
81
Added:
82
Added:
;;;;;;;;
83
Added:
;; Ferti
84
Added:
;;;;;;;;
85
Added:
86
Added:
(h2 () "Recette")
87
Added:
(table ([class "table"])
88
Added:
(tr (th () "Produit Fertilisant")
89
Added:
(th ([class "text-end"]) "Quantité"))
90
Added:
,@(for/list ([fertilizer-amount ferti-recipe]
91
Added:
#:when (not (zero? (cdr fertilizer-amount))))
92
Added:
(match-define (cons fertilizer amount) fertilizer-amount)
93
Added:
`(tr (td () ,(fertilizer-name fertilizer))
94
Added:
(td ([class "text-end font-monospace"]) ,(round 2 amount)))))
95
Added:
96
Added:
97
Added:
;;;;;;;;;
98
Added:
;; Cibles
99
Added:
;;;;;;;;;
100
Added:
101
Added:
(h2 () "Dernière Cible")
79
102
(a ([class "btn btn-primary mb-3"] [href "/target/new"]) "Créer une cible")
80
103
(table ([class "table"])
81
104
(tr (th "Nutriment")
@@ -85,22 +108,29 @@
85
108
,@(for/list ([n (get-nutrients)])
86
109
(define latest-target (get-latest-nutrient-target-value n))
87
110
(define latest-measurement (get-latest-nutrient-measurement-value n))
88
Removed:
(define delta-percentage (cond
89
Removed:
[(false? latest-target)
90
Removed:
#f]
91
Removed:
[(zero? latest-target)
92
Removed:
-100]
93
Removed:
[(zero? latest-measurement)
94
Removed:
100]
95
Removed:
[(number? latest-target)
96
Removed:
(* 100
97
Removed:
(/ (- latest-target latest-measurement)
98
Removed:
latest-measurement))]))
111
Added:
(define delta-percentage
112
Added:
(cond
113
Added:
[(false? latest-target)
114
Added:
#f]
115
Added:
[(zero? latest-target)
116
Added:
-100]
117
Added:
[(zero? latest-measurement)
118
Added:
100]
119
Added:
[(number? latest-target)
120
Added:
(* 100
121
Added:
(/ (- latest-target latest-measurement)
122
Added:
latest-measurement))]))
99
123
`(tr (td ,(nutrient-name n))
100
Removed:
(td ([class "text-end"]) ,(if latest-measurement (round 2 latest-measurement) "—"))
101
Removed:
(td ([class "text-end"]) ,(if latest-target (round 2 latest-target) "—"))
102
Removed:
(td ([class "text-end"]) ,(if delta-percentage (round 1 delta-percentage) "—")))))
124
Added:
(td ([class "text-end font-monospace"]) ,(if latest-measurement (round 2 latest-measurement) "—"))
125
Added:
(td ([class "text-end font-monospace"]) ,(if latest-target (round 2 latest-target) "—"))
126
Added:
(td ([class "text-end font-monospace"]) ,(if delta-percentage (round 1 delta-percentage) "—")))))
103
127
128
Added:
129
Added:
;;;;;;;;;;
130
Added:
;; Relevés
131
Added:
;;;;;;;;;;
132
Added:
133
Added:
(h2 () "Relevés")
104
134
(a ([class "btn btn-primary mb-3"] [href "/measurement/new"]) "Ajouter un relevé")
105
135
(table ([class "table table-striped"])
106
136
(tr (th "Date")