summaryrefslogtreecommitdiff
path: root/formlets.rkt
diff options
context:
space:
mode:
authorMarius Peter <dev@marius-peter.com>2025-10-21 21:36:09 +0200
committerMarius Peter <dev@marius-peter.com>2025-10-21 21:36:09 +0200
commit86b5343292e852155dab10fc8db39c2dd2b932eb (patch)
treebe7da4f70ecf803aec3b3e3498d6e2ed6e98003f /formlets.rkt
parent9bdb71dfc7d10b20bf8f78823194f4e114f8fa16 (diff)
Added views, formlets, and handlers for nutrient target management.
Diffstat (limited to 'formlets.rkt')
-rw-r--r--formlets.rkt49
1 files changed, 46 insertions, 3 deletions
diff --git a/formlets.rkt b/formlets.rkt
index 406a54a..d0067e3 100644
--- a/formlets.rkt
+++ b/formlets.rkt
@@ -1,11 +1,14 @@
#lang racket
-(provide measurements-formlet)
+(provide measurements-formlet
+ targets-formlet)
(require gregor
web-server/http
web-server/formlets
- "models/nutrient.rkt")
+ "models/nutrient.rkt"
+ "models/crop.rkt"
+ "models/crop-requirement.rkt")
(define date-formlet
@@ -26,7 +29,7 @@
[id ,(number->string id)]
[step "0.1"]
[placeholder ,(nutrient-name nutrient)])))
- (define input-label `(label ((for ,(number->string id))) ,(nutrient-name nutrient)))
+ (define input-label `(label ([for ,(number->string id)]) ,(nutrient-name nutrient)))
(formlet
(#%#
(div ([class "form-floating mb-3"])
@@ -51,3 +54,43 @@
(let ([measured-on (first measured-on*)]
[measurements (filter pair? measurements*)]) ; drop #f’s from empty values
(values measured-on measurements))))
+
+(define (crop-requirement-formlet requirement)
+ (define id (crop-requirement-id requirement))
+ (define profile (crop-requirement-profile requirement))
+ (define maybe-crop (crop-requirement-crop-id requirement))
+ (define crop (if maybe-crop (crop-name (get-crop #:id maybe-crop)) #f))
+ (define number-input
+ (input #:type "number"
+ #:attributes `([class "form-control"]
+ [id ,(number->string id)]
+ [step "1"]
+ [placeholder ,profile])))
+ (define input-label `(label ([for ,(number->string id)])
+ ,(if crop
+ (format "~a (~a)" crop profile)
+ (format "~a" profile))))
+ (formlet
+ (#%#
+ (div ([class "form-floating mb-3"])
+ ,{=> number-input requirement-proportion-b}
+ ,input-label))
+ (let ([requirement-proportion (string->number
+ (bytes->string/utf-8
+ (binding:form-value requirement-proportion-b)))])
+ (and requirement-proportion (cons requirement requirement-proportion)))))
+
+(define (targets-formlet)
+ (formlet*
+ (#%#
+ `(div ([class "mb-3"])
+ (h5 "Date ciblée")
+ ,{=>* date-formlet effective-on*})
+ `(div ([class "mb-3"])
+ (h5 "Valeurs cibles")
+ ,@(for/list ([requirement (get-crop-requirements)])
+ {=>* (crop-requirement-formlet requirement) requirements*}))
+ {=>* (submit "Enregistrer la cible" #:attributes '([class "btn btn-primary"])) _})
+ (let ([effective-on (first effective-on*)]
+ [requirements (filter pair? requirements*)]) ; drop #f’s from empty values
+ (values effective-on requirements))))
Copyright 2019--2025 Marius PETER