[Racket] Ferti hydroponic nutrient solver, redux.
Complete parent commit.
formlets.rkt
@@ -5,45 +5,50 @@
5
5
fertilizer-formlet)
6
6
7
7
(require gregor
8
Removed:
web-server/http
9
8
web-server/formlets
10
9
"models/nutrient.rkt"
11
10
"models/crop.rkt"
12
11
"models/crop-requirement.rkt")
13
12
14
Removed:
(define date-formlet
15
Removed:
(to-string (required (input #:type "date"
16
Removed:
#:value (date->iso8601 (today))
17
Removed:
#:attributes '((class "form-control") [required "required"])))))
18
Removed:
19
Removed:
(define (nutrient-value-formlet nutrient)
20
Removed:
(define id (number->string (nutrient-id nutrient)))
21
Removed:
(define number-input
22
Removed:
(input #:type "number"
23
Removed:
#:attributes `((class "form-control") [id ,id]
24
Removed:
[step "0.1"]
25
Removed:
[placeholder ,(nutrient-french-name nutrient)])))
26
Removed:
(define input-label
27
Removed:
`(label ((for ,id
28
Removed:
))
29
Removed:
,(nutrient-french-name nutrient)))
30
Removed:
(formlet (#%# (div ((class "form-floating mb-3")) ,{=> number-input nutrient-value-b} ,input-label))
31
Removed:
(let ([nutrient-value (string->number (bytes->string/utf-8
32
Removed:
(binding:form-value nutrient-value-b)))])
33
Removed:
(and nutrient-value (cons nutrient nutrient-value)))))
34
Removed:
35
13
(define (measurements-formlet)
36
14
(formlet* (#%# `(div ((class "mb-3")) (h5 "Date du relevé") ,{=>* date-formlet measured-on*})
37
15
`(div ((class "mb-3"))
38
16
(h5 "Valeurs du relevé")
39
17
,@(for/list ([nutrient (get-nutrients)])
40
Removed:
{=>* (nutrient-value-formlet nutrient) measurements*}))
18
Added:
{=>* (nutrient-value-formlet nutrient) nutrient-values*}))
41
19
{=>* (submit "Enregistrer le relevé" #:attributes '((class "btn btn-primary"))) _})
42
20
(let ([measured-on (first measured-on*)]
43
Removed:
[nutrient-values (for/hash ([nv (in-list (filter pair? measurements*))])
21
Added:
[nutrient-values (for/hash ([nv nutrient-values*])
44
22
(values (car nv) (cdr nv)))])
45
23
(values measured-on nutrient-values))))
46
24
25
Added:
(define (targets-formlet)
26
Added:
(formlet* (#%# `(div ((class "mb-3")) (h5 "Date ciblée") ,{=>* date-formlet effective-on*})
27
Added:
`(div ((class "mb-3"))
28
Added:
(h5 "Valeurs cibles (%)")
29
Added:
,@(for/list ([requirement (get-crop-requirements)])
30
Added:
{=>* (crop-requirement-formlet requirement) requirements*}))
31
Added:
{=>* (submit "Enregistrer la cible" #:attributes '((class "btn btn-primary"))) _})
32
Added:
(let ([effective-on (first effective-on*)]
33
Added:
[nutrient-values (average-crop-requirement-nutrient-values (filter pair?
34
Added:
requirements*))])
35
Added:
(values effective-on nutrient-values))))
36
Added:
37
Added:
(define (fertilizer-formlet)
38
Added:
(formlet*
39
Added:
(#%# `(div ((class "mb-3")) (h5 "Nom de référence") ,{=>* required-string-input canonical-name*})
40
Added:
`(div ((class "mb-3")) (h5 "Nom de marque") ,{=>* required-string-input brand-name*})
41
Added:
`(div ((class "mb-3"))
42
Added:
(h5 "Valeurs de l'intrant")
43
Added:
,@(for/list ([nutrient (get-nutrients)])
44
Added:
{=>* (nutrient-value-formlet nutrient) nutrient-values*}))
45
Added:
{=>* (submit "Enregistrer l'intrant" #:attributes '((class "btn btn-primary"))) _})
46
Added:
(let ([canonical-name (first canonical-name*)]
47
Added:
[nutrient-values (for/hash ([nv nutrient-values*])
48
Added:
(values (car nv) (cdr nv)))]
49
Added:
[brand-name (first brand-name*)])
50
Added:
(values canonical-name brand-name nutrient-values))))
51
Added:
47
52
(define (crop-requirement-formlet requirement)
48
53
(define id (number->string (crop-requirement-id requirement)))
49
54
(define profile (crop-requirement-profile requirement))
@@ -52,11 +57,16 @@
52
57
(if maybe-crop
53
58
(crop-name (get-crop #:id maybe-crop))
54
59
#f))
55
Removed:
(define number-input
56
Removed:
(input
57
Removed:
#:type "number"
58
Removed:
#:attributes
59
Removed:
`((class "form-control") [id ,id] [min "0"] [max "100"] [step "1"] [placeholder ,profile])))
60
Added:
(define percentage-input
61
Added:
(to-number (to-string (required (input #:type "number"
62
Added:
#:attributes
63
Added:
`((class "form-control") [required "required"]
64
Added:
[id ,id]
65
Added:
[name ,id]
66
Added:
[min "0"]
67
Added:
[max "100"]
68
Added:
[step "1"]
69
Added:
[placeholder ,profile]))))))
60
70
(define input-label
61
71
`(label ((for ,id
62
72
))