Show events with pagination
This commit is contained in:
+41
-12
@@ -4,15 +4,18 @@ import (
|
||||
"maragu.dev/gomponents"
|
||||
htmx "maragu.dev/gomponents-htmx"
|
||||
"net/http"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type HtmxContext interface {
|
||||
Render(node gomponents.Node)
|
||||
SetError(err error)
|
||||
GetLanguage() Language
|
||||
GetActivePath() *ActivePath
|
||||
HasActivePath() bool
|
||||
SetActivePath(activePath *ActivePath)
|
||||
GetPath() string
|
||||
GetPathParam(key string, defaultValue ...string) string
|
||||
}
|
||||
|
||||
type HtmxContextImpl struct {
|
||||
@@ -22,6 +25,25 @@ type HtmxContextImpl struct {
|
||||
activePath *ActivePath
|
||||
}
|
||||
|
||||
func (c *HtmxContextImpl) SetError(err error) {
|
||||
_, writeErr := c.res.Write([]byte(err.Error()))
|
||||
if writeErr != nil {
|
||||
Error("failed to write error", writeErr)
|
||||
}
|
||||
c.res.WriteHeader(500)
|
||||
}
|
||||
|
||||
func (c *HtmxContextImpl) GetPathParam(key string, defaultValue ...string) string {
|
||||
pathParam := c.req.PathValue(key)
|
||||
if pathParam != "" {
|
||||
return pathParam
|
||||
}
|
||||
if len(defaultValue) > 0 {
|
||||
return defaultValue[0]
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (c *HtmxContextImpl) GetPath() string {
|
||||
return c.req.URL.Path
|
||||
}
|
||||
@@ -50,11 +72,7 @@ func (c *HtmxContextImpl) Render(node gomponents.Node) {
|
||||
err := node.Render(c.res)
|
||||
if err != nil {
|
||||
Error("failed to render", err)
|
||||
_, writeErr := c.res.Write([]byte(err.Error()))
|
||||
if writeErr != nil {
|
||||
Error("failed to write error", writeErr)
|
||||
}
|
||||
c.res.WriteHeader(500)
|
||||
c.SetError(err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,12 +85,16 @@ type HtmxPathParam struct {
|
||||
|
||||
type HtmxRoute interface {
|
||||
WithPathParams(params ...HtmxPathParam) HtmxRoute
|
||||
ToUrl(queryParams ...HtmxPathParam) string
|
||||
GetHtmx(queryParams ...HtmxPathParam) gomponents.Node
|
||||
ToUrl(language Language, queryParams ...HtmxPathParam) string
|
||||
GetHtmx(language Language, queryParams ...HtmxPathParam) gomponents.Node
|
||||
SetActivePath(activePath *ActivePath) HtmxRoute
|
||||
Add(server *http.ServeMux)
|
||||
}
|
||||
|
||||
func addLanguageToPath(path string, language Language) string {
|
||||
return "/" + string(language) + path
|
||||
}
|
||||
|
||||
type HtmxGetRoute struct {
|
||||
Path string
|
||||
RouteFunc HtmxRouteFunc
|
||||
@@ -92,7 +114,7 @@ func NewHtmxGetRoute(path string, routeFunc HtmxRouteFunc, languages ...Language
|
||||
|
||||
func (h HtmxGetRoute) Add(server *http.ServeMux) {
|
||||
for _, language := range h.Languages {
|
||||
server.HandleFunc("GET /"+string(language)+h.Path, func(res http.ResponseWriter, req *http.Request) {
|
||||
server.HandleFunc("GET "+addLanguageToPath(h.Path, language), func(res http.ResponseWriter, req *http.Request) {
|
||||
context := NewHtmxContext(req, res, language)
|
||||
if h.ActivePath != nil {
|
||||
context.SetActivePath(h.ActivePath)
|
||||
@@ -107,10 +129,17 @@ func (h HtmxGetRoute) WithPathParams(params ...HtmxPathParam) HtmxRoute {
|
||||
return h
|
||||
}
|
||||
|
||||
func (h HtmxGetRoute) ToUrl(queryParams ...HtmxPathParam) string {
|
||||
func (h HtmxGetRoute) ToUrl(language Language, queryParams ...HtmxPathParam) string {
|
||||
if len(h.PathParams) == 0 {
|
||||
return h.Path
|
||||
}
|
||||
|
||||
func (h HtmxGetRoute) GetHtmx(queryParams ...HtmxPathParam) gomponents.Node {
|
||||
return htmx.Get(h.ToUrl(queryParams...))
|
||||
path := addLanguageToPath(h.Path, language)
|
||||
for _, param := range h.PathParams {
|
||||
path = strings.ReplaceAll(path, "{"+param.Key+"}", param.Value)
|
||||
}
|
||||
return path
|
||||
}
|
||||
|
||||
func (h HtmxGetRoute) GetHtmx(language Language, queryParams ...HtmxPathParam) gomponents.Node {
|
||||
return htmx.Get(h.ToUrl(language, queryParams...))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user