summaryrefslogtreecommitdiff
path: root/views.rkt
diff options
context:
space:
mode:
authorMarius Peter <dev@marius-peter.com>2025-11-29 19:14:22 +0100
committerMarius Peter <dev@marius-peter.com>2025-11-29 19:14:22 +0100
commitf30c8fdb5c2d4aaad025a51329373ccfc0e56ed1 (patch)
treec8fec81df5fb291ac717b255d763ae53d4f9a6b4 /views.rkt
parentbc3047f3a5b7b5f5f0c1a62a295c53a5e1cac043 (diff)
Add a metric ton's worth of routes.
For now, let's emulate Rails routing, before we identify a more elegant architecture.
Diffstat (limited to 'views.rkt')
-rw-r--r--views.rkt82
1 files changed, 49 insertions, 33 deletions
diff --git a/views.rkt b/views.rkt
index 9aaed70..5f532aa 100644
--- a/views.rkt
+++ b/views.rkt
@@ -9,6 +9,9 @@
new-measurement-page
new-target-page
new-fertilizer-page
+ show-measurement-page
+ show-target-page
+ show-fertilizer-page
fallback-page)
(require gregor
@@ -17,6 +20,7 @@
"models/user.rkt"
"models/nutrient.rkt"
"models/nutrient-measurement.rkt"
+ "models/nutrient-target.rkt"
"models/fertilizer-product.rkt")
(define (page-template title body-xexpr)
@@ -89,28 +93,23 @@
(define (ferti-index-page)
(ferti-template
- '((p "La recette Ferti© est calculée en fonction d'un relevé de nutriments et d'une cible.")
+ `((p "La recette Ferti© est calculée en fonction d'un relevé de nutriments et d'une cible.")
(div ((class "btn-group-vertical"))
- (a ((class "btn btn-outline-primary") [href "/measurement/new"]) "Ajouter un relevé")
- (a ((class "btn btn-outline-primary") [href "/target/new"]) "Créer une cible")
- (a ((class "btn btn-outline-primary") [href "/fertilizer/new"]) "Ajouter un intrant")))))
+ (a ((class "btn btn-outline-primary") [href "/ferti/measurement/new"]) "Ajouter un relevé")
+ (a ((class "btn btn-outline-primary") [href "/ferti/target/new"]) "Créer une cible")
+ (a ((class "btn btn-outline-primary") [href "/ferti/fertilizer/new"])
+ "Ajouter un intrant")))))
(define (ferti-measurements-page nutrients measurements)
(define table
- `(table ((class "table table-striped"))
- (thead (tr (th "Date")
- ,@(for/list ([n nutrients])
- `(th ((class "text-end")) ,(nutrient-formula n)))))
- (tbody ,@
- (for/list ([m measurements])
- `(tr (td ,(nutrient-measurement-date m))
- ,@(for/list ([n nutrients])
- (define nutrient-value (hash-ref (nutrient-measurement-values m) n #f))
- `(td ((class "text-end"))
- ,(if nutrient-value
- (round 2 nutrient-value)
- "—"))))))))
- (ferti-template `((h2 () "Relevés") (a ((class "btn btn-primary mb-3") [href "/measurement/new"])
+ `(table ((class "table"))
+ (thead (tr (th "Date")))
+ (tbody ,@(for/list ([m measurements])
+ `(tr (td (a ((href ,(format "/ferti/measurement/~a"
+ (nutrient-measurement-id m))))
+ ,(nutrient-measurement-date m))))))))
+ (ferti-template `((h2 () "Relevés") (a ((class "btn btn-primary mb-3") [href
+ "/ferti/measurement/new"])
"Ajouter un relevé")
,table)))
@@ -132,9 +131,9 @@
,(if latest-target
(round 2 latest-target)
"—")))))))
- (ferti-template `((h2 () "Dernière Cible") (a ((class "btn btn-primary mb-3") [href "/target/new"])
- "Créer une cible")
- ,table)))
+ (ferti-template `((h2 () "Dernière Cible")
+ (a ((class "btn btn-primary mb-3") [href "/ferti/target/new"]) "Créer une cible")
+ ,table)))
(define (ferti-recipe-page fertilizer-recipe)
(define table
@@ -162,7 +161,8 @@
,@(for/list ([fertilizer fertilizers])
`(tr (td ,(fertilizer-name fertilizer))
(td ,(or (fertilizer-brand-name fertilizer) "—"))))))
- (ferti-template `((h2 () "Intrants") (a ((class "btn btn-primary mb-3") [href "/fertilizer/new"])
+ (ferti-template `((h2 () "Intrants") (a ((class "btn btn-primary mb-3") [href
+ "/ferti/fertilizer/new"])
"Ajouter un intrant")
,table)))
@@ -170,32 +170,48 @@
(page-template "Nouveau relevé"
`((h1 ((class "display-1 mb-3")) "Nouveau relevé")
(div ((class "mb-3") [style "max-width: 30em"])
- (form ([action "/measurement/create"] [method "POST"])
+ (form ([action "/ferti/measurement/create"] [method "POST"])
,@(formlet-display (measurements-formlet)))))))
(define (new-target-page)
(page-template "Nouvelle cible"
`((h1 ((class "display-1 mb-3")) "Nouvelle cible")
(div ((class "mb-3") [style "max-width: 30em"])
- (form ([action "/target/create"] [method "POST"])
+ (form ([action "/ferti/target/create"] [method "POST"])
,@(formlet-display (targets-formlet)))))))
(define (new-fertilizer-page)
(page-template "Nouvel intrant"
`((h1 ((class "display-1 mb-3")) "Nouvel intrant")
(div ((class "mb-3") [style "max-width: 30em"])
- (form ([action "/fertilizer/create"] [method "POST"])
+ (form ([action "/ferti/fertilizer/create"] [method "POST"])
,@(formlet-display (fertilizer-formlet)))))))
+(define (show-measurement-page nm)
+ (page-template (format "Relevé du ~a" (nutrient-measurement-date nm))
+ '((h1 ((class "display-1 mb-3")) "Relevé"))))
+
+(define (show-target-page nt)
+ (page-template (format "Cible ~a" (nutrient-target-id nt))
+ '((h1 ((class "display-1 mb-3")) "Cible"))))
+
+(define (show-fertilizer-page fp)
+ (page-template (format "Intrant ~a" (fertilizer-product-id fp))
+ '((h1 ((class "display-1 mb-3")) "Intrant"))))
+
(define (index-page user)
- (page-template "Bienvenue à la FAPG"
- `((h1 ((class "display-1 mb-3"))
- ,(string-join (list (if (<= (->hours (current-time)) 17) "Bonjour" "Bonsoir")
- (if user
- (user-name user)
- "et bienvenue"))))
- (p ,(~t (now) "'Dernière connexion à' HH:mm, 'le' EEEE d MMMM yyyy"))
- (a ((class "btn btn-primary mb-3") [href "/ferti/index"]) "Accéder à Ferti"))))
+ (page-template
+ "Bienvenue à la FAPG"
+ `((div ((class "jumbotron"))
+ (h1 ((class "display-1 mb-3"))
+ ,(string-join (list (if (<= (->hours (current-time)) 17) "Bonjour" "Bonsoir")
+ (if user
+ (user-name user)
+ "et bienvenue"))))
+ (hr ((class "my-3")))
+ (p ((class "lead")) ,(~t (now) "'Dernière connexion à' HH:mm, 'le' EEEE d MMMM yyyy"))
+ (p ((class "lead"))
+ (a ((class "btn btn-primary mb-3") [href "/ferti/index"]) "Accéder à Ferti"))))))
(define (fallback-page request-code)
(page-template (format "Réponse: ~a" request-code)
Copyright 2019--2026 Marius PETER