package handlers
import (
"html/template"
"net/http"
"os"
"path/filepath"
)
type TemplateRenderer struct {
funcs template.FuncMap
templates map[string]*template.Template
}
func NewTemplateRenderer(templateDir string) *TemplateRenderer {
funcs := template.FuncMap{
"formatBool": func(b bool) string {
if b {
return "Yes"
}
return "No"
},
"formatStatus": func(s string) string {
switch s {
case "running":
return "Running"
case "stopped":
return "Stopped"
case "starting":
return "Starting"
case "stopping":
return "Stopping"
case "error":
return "Error"
default:
return s
}
},
}
tr := &TemplateRenderer{funcs: funcs}
tr.templates = make(map[string]*template.Template)
pages := []string{
"index", "login", "signup", "dashboard",
"change_password", "admin_dashboard", "admin_users",
}
layoutContent, err := os.ReadFile(filepath.Join(templateDir, "layout.html"))
if err != nil {
panic(err)
}
for _, page := range pages {
pageContent, err := os.ReadFile(filepath.Join(templateDir, page+".html"))
if err != nil {
panic(err)
}
// Combine: page defines "body", layout is the root template
combined := string(pageContent) + "\n" + string(layoutContent)
tmpl, err := template.New("").Funcs(funcs).Parse(combined)
if err != nil {
panic(err)
}
tr.templates[page] = tmpl
}
return tr
}
func (tr *TemplateRenderer) Render(w http.ResponseWriter, r *http.Request, name string, data map[string]interface{}) {
tmpl, ok := tr.templates[name]
if !ok {
http.Error(w, "Template not found", http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "text/html; charset=utf-8")
if err := tmpl.Execute(w, data); err != nil {
http.Error(w, "Template error: "+err.Error(), http.StatusInternalServerError)
}
}