template system
This commit is contained in:
parent
711a68699a
commit
1172e23c16
4 changed files with 89 additions and 3 deletions
15
core.go
15
core.go
|
@ -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
45
template.go
Normal 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)
|
||||||
|
}
|
10
template/components/button.go
Normal file
10
template/components/button.go
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
package components
|
||||||
|
|
||||||
|
type Button struct {
|
||||||
|
Text string
|
||||||
|
Link string
|
||||||
|
Icon string
|
||||||
|
IsSubmit bool
|
||||||
|
IsPrimary bool
|
||||||
|
IsDisabled bool
|
||||||
|
}
|
22
template/components/button.html
Normal file
22
template/components/button.html
Normal 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}}
|
Loading…
Reference in a new issue