#lang racket (provide measurements-formlet rotation-formlet fertilizer-formlet) (require gregor web-server/formlets "models/nutrient.rkt" "models/nutrient-measurement.rkt" "models/fertilizer-product.rkt" "models/crop.rkt" "models/crop-rotation.rkt" "models/crop-requirement.rkt") (define (measurements-formlet #:value [nm #f]) (formlet* (#%# (=>* (to-string (required (hidden (if nm (number->string (nutrient-measurement-id nm)) "")))) id*) `(div ((class "mb-3")) (h5 "Date du relevé") ,(=>* (date-formlet #:value (if nm (nutrient-measurement-date nm) (date->iso8601 (today)))) measurement-date*)) `(div ((class "mb-3")) (h5 "Valeurs du relevé") ,@(for/list ([n (get-nutrients)]) (define v (if nm (nutrient-measurement-value nm n) 0)) (=>* (nutrient-value-formlet n v) nutrient-values*))) {=>* (submit "Enregistrer le relevé" #:attributes '((class "btn btn-primary"))) _}) (let ([id (first id*)] [measurement-date (first measurement-date*)] [nutrient-values (make-immutable-hash nutrient-values*)]) (nutrient-measurement id measurement-date nutrient-values)))) (define (rotation-formlet #:date [date-string #f]) (formlet* (#%# `(div ((class "mb-3")) (h5 "Date de l'assolement") ,{=>* (date-formlet #:value date-string) rotation-date*}) `(div ((class "mb-3")) (h5 "Répartition des cultures (%)") ,@(for/list ([requirement (get-crop-requirements)]) {=>* (crop-requirement-formlet requirement) requirements*})) {=>* (submit "Enregistrer la cible" #:attributes '((class "btn btn-primary"))) _}) (let ([rotation-date (first rotation-date*)] [requirement-proportions (make-immutable-hash requirements*)]) (values rotation-date requirement-proportions)))) (define (fertilizer-formlet #:value [fp #f]) (formlet* (#%# (=>* (to-string (required (hidden (if fp (number->string (fertilizer-product-id fp)) "")))) id*) `(div ((class "mb-3")) (h5 "Nom de référence") ,(=>* (required-string-input #:value (if fp (fertilizer-product-name fp) "")) canonical-name*)) `(div ((class "mb-3")) (h5 "Nom de marque") ,(=>* (required-string-input #:value (if fp (fertilizer-brand-name fp) "")) brand-name*)) `(div ((class "mb-3")) (h5 "Valeurs de l'intrant") ,@(for/list ([n (get-nutrients)]) (define v (if fp (fertilizer-product-value fp n) 0)) (=>* (nutrient-value-formlet n v) nutrient-values*))) (=>* (submit (string-join (list (if fp "Modifier" "Enregistrer") "l'intrant")) #:attributes '((class "btn btn-primary"))) _)) (let ([id (string->number (first id*))] [canonical-name (first canonical-name*)] [brand-name (first brand-name*)] [nutrient-values (for/hash ([nv nutrient-values*]) (values (car nv) (cdr nv)))]) (fertilizer-product id 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 #:value [date-string #f]) (to-string (required (input #:type "date" #:value (or date-string (date->iso8601 (today))) #:attributes '((class "form-control") [required "required"]))))) (define (nutrient-value-formlet nutrient value) (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] [value ,(number->string value)] [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 #:value [str #f]) (to-string (required (text-input #:attributes `((class "form-control") [required "required"] [value ,(or str "")])))))