From 08b669fd8f91ce570e6ab6b6ef22648a3bb6c018 Mon Sep 17 00:00:00 2001 From: bronku Date: Sat, 29 Mar 2025 07:33:23 +0100 Subject: [PATCH] Implement shared template layout system --- internal/server/server.go | 14 +++++++------- internal/server/template.go | 20 ++++++++++++++------ internal/server/templates/cake.html | 11 +++++------ internal/server/templates/cakes.html | 12 +++++------- internal/server/templates/confirmation.html | 11 +++++------ internal/server/templates/layout/layout.html | 16 ++++++++++++++++ internal/server/templates/layout/nav.html | 6 ++++++ internal/server/templates/order.html | 11 +++++------ internal/server/templates/orders.html | 13 ++++++------- 9 files changed, 69 insertions(+), 45 deletions(-) create mode 100644 internal/server/templates/layout/layout.html create mode 100644 internal/server/templates/layout/nav.html diff --git a/internal/server/server.go b/internal/server/server.go index 47c32d6..7e1e839 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -8,7 +8,7 @@ import ( ) type Server struct { - tmpl *template.Template + tmpl map[string]*template.Template s *store.Store http.Handler } @@ -19,13 +19,13 @@ func (h *Server) Close() { func (h *Server) loadHandler() { mux := http.NewServeMux() - mux.HandleFunc("GET /order/", h.render(h.order, "order.html")) + mux.HandleFunc("GET /order/", h.render(h.order, "order")) mux.HandleFunc("GET /", h.redirect("/orders", http.StatusSeeOther)) - mux.HandleFunc("GET /orders", h.render(h.orders, "orders.html")) - mux.HandleFunc("POST /order/", h.render(h.postOrder, "confirmation.html")) - mux.HandleFunc("GET /cakes", h.render(h.cakes, "cakes.html")) - mux.HandleFunc("GET /cake/", h.render(h.cake, "cake.html")) - mux.HandleFunc("POST /cake/", h.render(h.postCake, "confirmation.html")) + mux.HandleFunc("GET /orders", h.render(h.orders, "orders")) + mux.HandleFunc("POST /order/", h.render(h.postOrder, "confirmation")) + mux.HandleFunc("GET /cakes", h.render(h.cakes, "cakes")) + mux.HandleFunc("GET /cake/", h.render(h.cake, "cake")) + mux.HandleFunc("POST /cake/", h.render(h.postCake, "confirmation")) h.Handler = mux } diff --git a/internal/server/template.go b/internal/server/template.go index e26a837..a554d0f 100644 --- a/internal/server/template.go +++ b/internal/server/template.go @@ -13,24 +13,32 @@ import ( var templates embed.FS func (h *Server) loadTemplates() { - var err error - h.tmpl, err = template.ParseFS(templates, "templates/*") - if err != nil { - log.Fatal(err) + h.tmpl = make(map[string]*template.Template) + pages := []string{"orders", "order", "cake", "cakes", "confirmation"} + for _, page := range pages { + tmpl, err := template.ParseFS(templates, + "templates/layout/*.html", + "templates/"+page+".html", + ) + if err != nil { + log.Fatal(err) + } + h.tmpl[page] = tmpl } } func (s *Server) render(fetch fetcher, templateName string) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("content-type", "text/html") data, code, err := fetch(r) if err != nil { logging.ErrorPage(err, code).ServeHTTP(w, r) return } - err = s.tmpl.ExecuteTemplate(w, templateName, data) + err = s.tmpl[templateName].ExecuteTemplate(w, "layout", data) if err != nil { logging.ErrorPage(err, http.StatusInternalServerError).ServeHTTP(w, r) + return } + w.Header().Set("content-type", "text/html") } } diff --git a/internal/server/templates/cake.html b/internal/server/templates/cake.html index 070c9d4..3e5a714 100644 --- a/internal/server/templates/cake.html +++ b/internal/server/templates/cake.html @@ -1,9 +1,7 @@ -
-

New Cake

-
- +{{define "title"}} +Cake +{{end}} +{{define "main"}}
@@ -29,3 +27,4 @@
+{{end}} diff --git a/internal/server/templates/cakes.html b/internal/server/templates/cakes.html index c13f080..0e898c6 100644 --- a/internal/server/templates/cakes.html +++ b/internal/server/templates/cakes.html @@ -1,10 +1,7 @@ -
-

Kill me please

-
- +{{define "title"}} +Cakes +{{end}} +{{define "main"}}
@@ -25,3 +22,4 @@ {{end}}
+{{end}} diff --git a/internal/server/templates/confirmation.html b/internal/server/templates/confirmation.html index df9812b..824fbc0 100644 --- a/internal/server/templates/confirmation.html +++ b/internal/server/templates/confirmation.html @@ -1,9 +1,8 @@ -
-

Confirmation

-
- +{{define "title"}} +Confirmed +{{end}} +{{define "main"}}

{{.ID}} confirmed

+{{end}} diff --git a/internal/server/templates/layout/layout.html b/internal/server/templates/layout/layout.html new file mode 100644 index 0000000..623b0d1 --- /dev/null +++ b/internal/server/templates/layout/layout.html @@ -0,0 +1,16 @@ +{{define "layout"}} + + + + + {{template "title" .}} + + +
+

{{template "title" .}}

+
+ + {{template "main" .}} + + +{{end}} diff --git a/internal/server/templates/layout/nav.html b/internal/server/templates/layout/nav.html new file mode 100644 index 0000000..b6fd88d --- /dev/null +++ b/internal/server/templates/layout/nav.html @@ -0,0 +1,6 @@ +{{define "nav"}} +All orders +New order +All Cakes +New Cake +{{end}} diff --git a/internal/server/templates/order.html b/internal/server/templates/order.html index 4c63bd2..af41295 100644 --- a/internal/server/templates/order.html +++ b/internal/server/templates/order.html @@ -1,9 +1,7 @@ -
-

New Order

-
- +{{define "title"}} + Order +{{end}} +{{define "main"}}
{{with .Order}} @@ -89,3 +87,4 @@ addCake({{.ID}}, '{{.Name}} {{.Price}}', {{.Amount}}) {{end}} +{{end}} diff --git a/internal/server/templates/orders.html b/internal/server/templates/orders.html index d67173e..d0b2cb1 100644 --- a/internal/server/templates/orders.html +++ b/internal/server/templates/orders.html @@ -1,10 +1,8 @@ -
-

Kill me please

-
- + +{{define "title"}} + Orders +{{end}} +{{define "main"}}
@@ -33,3 +31,4 @@ {{end}}
+{{end}}