From 86b5343292e852155dab10fc8db39c2dd2b932eb Mon Sep 17 00:00:00 2001 From: Marius Peter Date: Tue, 21 Oct 2025 21:36:09 +0200 Subject: Added views, formlets, and handlers for nutrient target management. --- formlets.rkt | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) (limited to 'formlets.rkt') 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)))) -- cgit v1.2.3