adjustments in render
This commit is contained in:
parent
2fea2e6ac5
commit
d54fbcacf0
15
render.go
15
render.go
@ -34,22 +34,17 @@ func (a *App) JSON(w http.ResponseWriter, code int, v any) {
|
|||||||
json.NewEncoder(w).Encode(v)
|
json.NewEncoder(w).Encode(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) HTML(w http.ResponseWriter, code int, layout, page string, td *TemplateData) {
|
func (a *App) HTML(w http.ResponseWriter, r *http.Request, code int, layout string, page string, td *TemplateData) {
|
||||||
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||||
w.WriteHeader(code)
|
w.WriteHeader(code)
|
||||||
err := a.Templates.Template(w, layout, page, td)
|
|
||||||
|
err := a.Templates.Render(w, layout, page, td, r.Header.Get("HX-Request") != "true")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("error rendering template", "error", err)
|
slog.Error("error rendering", "layout", layout, "page", page, "error", err)
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) RenderComponent(name string, td *TemplateData) (string, error) {
|
func (a *App) RenderComponent(name string, td *TemplateData) (string, error) {
|
||||||
result, err := a.Templates.RenderComponent(name, td)
|
return a.Templates.RenderComponent(name, td)
|
||||||
if err != nil {
|
|
||||||
slog.Error("error rendering component", "component", name, "error", err)
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return result, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
41
templates.go
41
templates.go
@ -3,6 +3,7 @@ package goblocks
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"html/template"
|
"html/template"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"maps"
|
"maps"
|
||||||
@ -40,6 +41,7 @@ func defaultHTMLRender() *Render {
|
|||||||
Functions: template.FuncMap{
|
Functions: template.FuncMap{
|
||||||
"default": defaultIfEmpty,
|
"default": defaultIfEmpty,
|
||||||
"dict": Dict,
|
"dict": Dict,
|
||||||
|
"duration": Duration,
|
||||||
},
|
},
|
||||||
templateCache: templateCache{},
|
templateCache: templateCache{},
|
||||||
}
|
}
|
||||||
@ -74,18 +76,36 @@ func cloneFuncMap(src template.FuncMap) template.FuncMap {
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (re *Render) Template(w http.ResponseWriter, layoutName, pageName string, td *TemplateData) error {
|
func (re *Render) Render(w http.ResponseWriter, layoutName, pageName string, td *TemplateData, useLayout bool) error {
|
||||||
if td == nil {
|
if td == nil {
|
||||||
td = &TemplateData{}
|
td = &TemplateData{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !useLayout {
|
||||||
|
path := filepath.Join(re.TemplatesPath, "pages", pageName)
|
||||||
|
|
||||||
|
funcs := cloneFuncMap(re.Functions)
|
||||||
|
tmpl, err := template.New(strings.TrimSuffix(pageName, ".gohtml")).Funcs(funcs).ParseFiles(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var buf bytes.Buffer
|
||||||
|
if err := tmpl.ExecuteTemplate(&buf, strings.TrimSuffix(pageName, ".gohtml"), td); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = buf.WriteTo(w)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
tmpl, err := re.loadTemplateWithLayout(layoutName, pageName)
|
tmpl, err := re.loadTemplateWithLayout(layoutName, pageName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
buf := new(bytes.Buffer)
|
var buf bytes.Buffer
|
||||||
if err = tmpl.ExecuteTemplate(buf, strings.TrimSuffix(layoutName, ".gohtml"), td); err != nil {
|
if err := tmpl.ExecuteTemplate(&buf, strings.TrimSuffix(layoutName, ".gohtml"), td); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,6 +123,7 @@ func (re *Render) RenderComponent(name string, td *TemplateData) (string, error)
|
|||||||
files := []string{path}
|
files := []string{path}
|
||||||
matches, err := filepath.Glob(filepath.Join(re.TemplatesPath, "components", "*.gohtml"))
|
matches, err := filepath.Glob(filepath.Join(re.TemplatesPath, "components", "*.gohtml"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
slog.Error("error loading component files", "error", err)
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
files = append(files, matches...)
|
files = append(files, matches...)
|
||||||
@ -110,11 +131,15 @@ func (re *Render) RenderComponent(name string, td *TemplateData) (string, error)
|
|||||||
funcs := cloneFuncMap(re.Functions)
|
funcs := cloneFuncMap(re.Functions)
|
||||||
tmpl, err := template.New(name).Funcs(funcs).ParseFiles(files...)
|
tmpl, err := template.New(name).Funcs(funcs).ParseFiles(files...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
slog.Error("error loading component files", "error", err)
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
err = tmpl.ExecuteTemplate(&buf, strings.TrimSuffix(name, ".gohtml"), td)
|
err = tmpl.ExecuteTemplate(&buf, strings.TrimSuffix(name, ".gohtml"), td)
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("error executing component template", "error", err)
|
||||||
|
}
|
||||||
return buf.String(), err
|
return buf.String(), err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -342,3 +367,13 @@ func FormatDateSpanish(date time.Time) string {
|
|||||||
|
|
||||||
return dayName + ", " + strconv.Itoa(day) + " de " + month + " de " + strconv.Itoa(year)
|
return dayName + ", " + strconv.Itoa(day) + " de " + month + " de " + strconv.Itoa(year)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Duration(start, end time.Time) string {
|
||||||
|
if end.IsZero() {
|
||||||
|
end = time.Now()
|
||||||
|
}
|
||||||
|
d := end.Sub(start)
|
||||||
|
h := int(d.Hours())
|
||||||
|
m := int(d.Minutes()) % 60
|
||||||
|
return fmt.Sprintf("%d:%02d", h, m)
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user