template system

This commit is contained in:
Zeni Kim 2024-09-24 16:12:17 -05:00
parent 711a68699a
commit 1172e23c16
4 changed files with 89 additions and 3 deletions

15
core.go
View file

@ -6,6 +6,7 @@
package core package core
import ( import (
"embed"
"fmt" "fmt"
"log" "log"
"net/http" "net/http"
@ -37,12 +38,15 @@ var mailer *Mailer
var basePath string var basePath string
var disableEvents bool = false var disableEvents bool = false
//go:embed all:template
var resources embed.FS
type configContainer struct { type configContainer struct {
Request RequestConfig Request RequestConfig
} }
type App struct { type App struct {
t int // for trancking hooks t int // for tracking hooks
chain *chain chain *chain
hooks *Hooks hooks *Hooks
Config *configContainer Config *configContainer
@ -88,11 +92,16 @@ func (app *App) Run(router *httprouter.Router) {
TemplateEnableStr = "false" TemplateEnableStr = "false"
} }
TemplateEnable, _ := strconv.ParseBool(TemplateEnableStr) TemplateEnable, _ := strconv.ParseBool(TemplateEnableStr)
// if enabled, add public path // if enabled,
if TemplateEnable { if TemplateEnable {
// add public path
publicPath := os.Getenv("TEMPLATE_PUBLIC") publicPath := os.Getenv("TEMPLATE_PUBLIC")
router.ServeFiles("/public/*filepath", http.Dir(publicPath)) router.ServeFiles("/public/*filepath", http.Dir(publicPath))
// templates
var template = new(Template)
template.NewTemplates(resources)
} }
useHttpsStr := os.Getenv("App_USE_HTTPS") useHttpsStr := os.Getenv("App_USE_HTTPS")

45
template.go Normal file
View file

@ -0,0 +1,45 @@
// Copyright (c) 2024 Zeni Kim <zenik@smarteching.com>
// Use of this source code is governed by MIT-style
// license that can be found in the LICENSE file.
package core
import (
"bytes"
"embed"
"fmt"
"html/template"
"io/fs"
"net/http"
"strings"
)
type Template struct {
tmpl *template.Template
}
func (t *Template) NewTemplates(resources embed.FS) {
var paths []string
fs.WalkDir(resources, ".", func(path string, d fs.DirEntry, err error) error {
if strings.Contains(d.Name(), ".html") {
paths = append(paths, path)
}
return nil
})
t.tmpl = template.Must(template.ParseFS(resources, paths...))
}
func (t *Template) Render(w http.ResponseWriter, name string, data interface{}) {
var buffer bytes.Buffer
err := t.tmpl.ExecuteTemplate(&buffer, name, data)
if err != nil {
err = fmt.Errorf("error executing template: %w", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "text/html; charset=UTF-8")
buffer.WriteTo(w)
}

View file

@ -0,0 +1,10 @@
package components
type Button struct {
Text string
Link string
Icon string
IsSubmit bool
IsPrimary bool
IsDisabled bool
}

View file

@ -0,0 +1,22 @@
{{define "button"}}
<button class="button-container">
<a class="button {{if .IsPrimary}}primary{{end}}" {{if eq .IsSubmit true}}type="submit"{{else}}href="{{.Link}}"{{end}}>
{{.Text}}
<!-- tailwind heroicons -->
{{if eq .Icon "gear"}}
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="icon">
<path stroke-linecap="round" stroke-linejoin="round" d="M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.325.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 0 1 1.37.49l1.296 2.247a1.125 1.125 0 0 1-.26 1.431l-1.003.827c-.293.241-.438.613-.43.992a7.723 7.723 0 0 1 0 .255c-.008.378.137.75.43.991l1.004.827c.424.35.534.955.26 1.43l-1.298 2.247a1.125 1.125 0 0 1-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.47 6.47 0 0 1-.22.128c-.331.183-.581.495-.644.869l-.213 1.281c-.09.543-.56.94-1.11.94h-2.594c-.55 0-1.019-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 0 1-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 0 1-1.369-.49l-1.297-2.247a1.125 1.125 0 0 1 .26-1.431l1.004-.827c.292-.24.437-.613.43-.991a6.932 6.932 0 0 1 0-.255c.007-.38-.138-.751-.43-.992l-1.004-.827a1.125 1.125 0 0 1-.26-1.43l1.297-2.247a1.125 1.125 0 0 1 1.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.086.22-.128.332-.183.582-.495.644-.869l.214-1.28Z" />
<path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z" />
</svg>
{{else if eq .Icon "arrow-right"}}
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="icon">
<path stroke-linecap="round" stroke-linejoin="round" d="M13.5 4.5 21 12m0 0-7.5 7.5M21 12H3" />
</svg>
{{else if eq .Icon "plus"}}
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="icon">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 4.5v15m7.5-7.5h-15" />
</svg>
{{end}}
</a>
</button>
{{end}}