94 lines
2.6 KiB
Go
94 lines
2.6 KiB
Go
package handlers
|
|
|
|
import (
|
|
"github.com/labstack/echo/v4"
|
|
|
|
"git.grosinger.net/tgrosinger/saasitone/pkg/page"
|
|
"git.grosinger.net/tgrosinger/saasitone/pkg/services"
|
|
"git.grosinger.net/tgrosinger/saasitone/templ/layouts"
|
|
"git.grosinger.net/tgrosinger/saasitone/templ/pages"
|
|
)
|
|
|
|
const (
|
|
routeNameAbout = "about"
|
|
routeNameHome = "home"
|
|
)
|
|
|
|
type (
|
|
Pages struct {
|
|
*services.TemplateRenderer
|
|
*services.DBClient
|
|
}
|
|
)
|
|
|
|
func init() {
|
|
Register(new(Pages))
|
|
}
|
|
|
|
func (h *Pages) Init(c *services.Container) error {
|
|
h.TemplateRenderer = c.TemplateRenderer
|
|
h.DBClient = c.DB
|
|
return nil
|
|
}
|
|
|
|
func (h *Pages) Routes(g *echo.Group) {
|
|
g.GET("/", h.Home).Name = routeNameHome
|
|
g.GET("/about", h.About).Name = routeNameAbout
|
|
}
|
|
|
|
func (h *Pages) Home(ctx echo.Context) error {
|
|
p := page.New(ctx)
|
|
p.Metatags.Description = "Welcome to the homepage."
|
|
p.Metatags.Keywords = []string{"Go", "MVC", "Web", "Software"}
|
|
p.Pager = page.NewPager(ctx, 4)
|
|
p.LayoutComponent = layouts.Main
|
|
|
|
data := h.Post.FetchAll(&p.Pager)
|
|
component := pages.Home(p, data)
|
|
|
|
return h.RenderPageTempl(ctx, p, component)
|
|
}
|
|
|
|
func (h *Pages) About(ctx echo.Context) error {
|
|
p := page.New(ctx)
|
|
p.Title = "About"
|
|
p.LayoutComponent = layouts.Main
|
|
|
|
// This page will be cached!
|
|
p.Cache.Enabled = true
|
|
p.Cache.Tags = []string{"page_about", "page:list"}
|
|
|
|
// A simple example of how the Data field can contain anything you want to send to the templates
|
|
// even though you wouldn't normally send markup like this
|
|
data := pages.AboutData{
|
|
ShowCacheWarning: true,
|
|
FrontendTabs: []pages.AboutTab{
|
|
{
|
|
Title: "HTMX",
|
|
Body: `Completes HTML as a hypertext by providing attributes to AJAXify anything and much more. Visit <a href="https://htmx.org/">htmx.org</a> to learn more.`,
|
|
},
|
|
{
|
|
Title: "Alpine.js",
|
|
Body: `Drop-in, Vue-like functionality written directly in your markup. Visit <a href="https://alpinejs.dev/">alpinejs.dev</a> to learn more.`,
|
|
},
|
|
{
|
|
Title: "Bulma",
|
|
Body: `Ready-to-use frontend components that you can easily combine to build responsive web interfaces with no JavaScript requirements. Visit <a href="https://bulma.io/">bulma.io</a> to learn more.`,
|
|
},
|
|
},
|
|
BackendTabs: []pages.AboutTab{
|
|
{
|
|
Title: "Echo",
|
|
Body: `High performance, extensible, minimalist Go web framework. Visit <a href="https://echo.labstack.com/">echo.labstack.com</a> to learn more.`,
|
|
},
|
|
{
|
|
Title: "Ent",
|
|
Body: `Simple, yet powerful ORM for modeling and querying data. Visit <a href="https://entgo.io/">entgo.io</a> to learn more.`,
|
|
},
|
|
},
|
|
}
|
|
|
|
component := pages.About(p, data)
|
|
return h.RenderPageTempl(ctx, p, component)
|
|
}
|