diff options
| author | Marius Peter <dev@marius-peter.com> | 2025-10-19 21:15:18 +0200 | 
|---|---|---|
| committer | Marius Peter <dev@marius-peter.com> | 2025-10-19 21:15:18 +0200 | 
| commit | 3008eb25f79ef1ed54fcc2b3f5b6635b34394680 (patch) | |
| tree | 2b5d2274eff2302e1acd4600869c09ec615262f2 /formlets.rkt | |
Absorb existing domain data.
Diffstat (limited to 'formlets.rkt')
| -rw-r--r-- | formlets.rkt | 53 | 
1 files changed, 53 insertions, 0 deletions
diff --git a/formlets.rkt b/formlets.rkt new file mode 100644 index 0000000..406a54a --- /dev/null +++ b/formlets.rkt @@ -0,0 +1,53 @@ +#lang racket + +(provide measurements-formlet) + +(require gregor +         web-server/http +         web-server/formlets +         "models/nutrient.rkt") + + +(define date-formlet +  (formlet +   ,{=> (to-string +         (required +          (input #:type "date" +                 #:value (date->iso8601 (today)) +                 #:attributes '([class "form-control"] [required "required"])))) +        date-b} +   date-b)) + +(define (measurement-formlet nutrient) +  (define id (nutrient-id nutrient)) +  (define number-input +    (input #:type "number" +           #:attributes `([class "form-control"] +                          [id ,(number->string id)] +                          [step "0.1"] +                          [placeholder ,(nutrient-name nutrient)]))) +  (define input-label `(label ((for ,(number->string id))) ,(nutrient-name nutrient))) +  (formlet +   (#%# +    (div ([class "form-floating mb-3"]) +         ,{=> number-input nutrient-value-b} +         ,input-label)) +   (let ([nutrient-value (string->number +                          (bytes->string/utf-8 +                           (binding:form-value nutrient-value-b)))]) +     (and nutrient-value (cons id nutrient-value))))) + +(define (measurements-formlet) +  (formlet* +   (#%# +    `(div ([class "mb-3"]) +          (h5 "Date du relevé") +          ,{=>* date-formlet measured-on*}) +    `(div ([class "mb-3"]) +          (h5 "Valeurs du relevé") +          ,@(for/list ([nutrient (get-nutrients)]) +              {=>* (measurement-formlet nutrient) measurements*})) +    {=>* (submit "Enregistrer le relevé" #:attributes '([class "btn btn-primary"])) _}) +   (let ([measured-on (first measured-on*)] +         [measurements (filter pair? measurements*)]) ; drop #f’s from empty values +     (values measured-on measurements))))  |