#lang racket (provide measurements-formlet targets-formlet fertilizer-formlet) (require gregor web-server/formlets "models/nutrient.rkt" "models/crop.rkt" "models/crop-requirement.rkt") (define (measurements-formlet) (formlet* (#%# `(div ((class "mb-3")) (h5 "Date du relevé") ,{=>* date-formlet measurement-date*}) `(div ((class "mb-3")) (h5 "Valeurs du relevé") ,@(for/list ([nutrient (get-nutrients)]) {=>* (nutrient-value-formlet nutrient) nutrient-values*})) {=>* (submit "Enregistrer le relevé" #:attributes '((class "btn btn-primary"))) _}) (let ([measurement-date (first measurement-date*)] [nutrient-values (for/hash ([nv nutrient-values*]) (values (car nv) (cdr nv)))]) (values measurement-date nutrient-values)))) (define (targets-formlet) (formlet* (#%# `(div ((class "mb-3")) (h5 "Date ciblée") ,{=>* date-formlet target-date*}) `(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 ([target-date (first target-date*)] [nutrient-values (average-crop-requirement-nutrient-values (filter pair? requirements*))]) (values target-date nutrient-values)))) (define (fertilizer-formlet) (formlet* (#%# `(div ((class "mb-3")) (h5 "Nom de référence") ,{=>* required-string-input canonical-name*}) `(div ((class "mb-3")) (h5 "Nom de marque") ,{=>* required-string-input brand-name*}) `(div ((class "mb-3")) (h5 "Valeurs de l'intrant") ,@(for/list ([nutrient (get-nutrients)]) {=>* (nutrient-value-formlet nutrient) nutrient-values*})) {=>* (submit "Enregistrer l'intrant" #:attributes '((class "btn btn-primary"))) _}) (let ([canonical-name (first canonical-name*)] [nutrient-values (for/hash ([nv nutrient-values*]) (values (car nv) (cdr nv)))] [brand-name (first brand-name*)]) (values canonical-name brand-name nutrient-values)))) (define (crop-requirement-formlet requirement) (define id (number->string (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 percentage-input (to-number (to-string (required (input #:type "number" #:attributes `((class "form-control") [required "required"] [id ,id] [name ,id] [min "0"] [max "100"] [step "1"] [placeholder ,profile])))))) (define input-label `(label ((for ,id )) ,(if crop (format "~a (~a)" crop profile) (format "~a" profile)))) (formlet (div ((class "form-floating mb-3")) ,{=> percentage-input requirement-percentage} ,input-label) (cons requirement requirement-percentage))) (define date-formlet (to-string (required (input #:type "date" #:value (date->iso8601 (today)) #:attributes '((class "form-control") [required "required"]))))) (define (nutrient-value-formlet nutrient) (define id (number->string (nutrient-id nutrient))) (define number-input (to-number (to-string (required (input #:type "number" #:attributes `((class "form-control") [required "required"] [id ,id] [name ,id] [step "0.1"] [placeholder ,(nutrient-french-name nutrient)])))))) (define input-label `(label ((for ,id )) ,(nutrient-french-name nutrient))) (formlet (div ((class "form-floating mb-3")) ,{=> number-input nutrient-value} ,input-label) (cons nutrient nutrient-value))) (define required-string-input (to-string (required (text-input #:attributes '((class "form-control") [required "required"])))))