Upgrade to HTMX 2.0.
This commit is contained in:
parent
6da0fcb7be
commit
73098499dd
@ -6,37 +6,45 @@ import (
|
|||||||
"github.com/labstack/echo/v4"
|
"github.com/labstack/echo/v4"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Headers (https://htmx.org/docs/#requests)
|
// Request headers: https://htmx.org/docs/#request-headers
|
||||||
const (
|
const (
|
||||||
HeaderRequest = "HX-Request"
|
HeaderBoosted = "HX-Boosted"
|
||||||
HeaderBoosted = "HX-Boosted"
|
HeaderHistoryRestoreRequest = "HX-History-Restore-Request"
|
||||||
HeaderTrigger = "HX-Trigger"
|
HeaderPrompt = "HX-Prompt"
|
||||||
HeaderTriggerName = "HX-Trigger-Name"
|
HeaderRequest = "HX-Request"
|
||||||
HeaderTriggerAfterSwap = "HX-Trigger-After-Swap"
|
HeaderTarget = "HX-Target"
|
||||||
HeaderTriggerAfterSettle = "HX-Trigger-After-Settle"
|
HeaderTrigger = "HX-Trigger"
|
||||||
HeaderTarget = "HX-Target"
|
HeaderTriggerName = "HX-Trigger-Name"
|
||||||
HeaderPrompt = "HX-Prompt"
|
)
|
||||||
HeaderPush = "HX-Push"
|
|
||||||
|
// Response headers: https://htmx.org/docs/#response-headers
|
||||||
|
const (
|
||||||
|
HeaderPushURL = "HX-Push-Url"
|
||||||
HeaderRedirect = "HX-Redirect"
|
HeaderRedirect = "HX-Redirect"
|
||||||
|
HeaderReplaceURL = "HX-Replace-Url"
|
||||||
HeaderRefresh = "HX-Refresh"
|
HeaderRefresh = "HX-Refresh"
|
||||||
|
HeaderTriggerAfterSettle = "HX-Trigger-After-Settle"
|
||||||
|
HeaderTriggerAfterSwap = "HX-Trigger-After-Swap"
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
// Request contains data that HTMX provides during requests
|
// Request contains data that HTMX provides during requests
|
||||||
Request struct {
|
Request struct {
|
||||||
Enabled bool
|
Enabled bool
|
||||||
Boosted bool
|
Boosted bool
|
||||||
Trigger string
|
HistoryRestore bool
|
||||||
TriggerName string
|
Trigger string
|
||||||
Target string
|
TriggerName string
|
||||||
Prompt string
|
Target string
|
||||||
|
Prompt string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Response contain data that the server can communicate back to HTMX
|
// Response contain data that the server can communicate back to HTMX
|
||||||
Response struct {
|
Response struct {
|
||||||
Push string
|
PushURL string
|
||||||
Redirect string
|
Redirect string
|
||||||
Refresh bool
|
Refresh bool
|
||||||
|
ReplaceURL string
|
||||||
Trigger string
|
Trigger string
|
||||||
TriggerAfterSwap string
|
TriggerAfterSwap string
|
||||||
TriggerAfterSettle string
|
TriggerAfterSettle string
|
||||||
@ -47,19 +55,20 @@ type (
|
|||||||
// GetRequest extracts HTMX data from the request
|
// GetRequest extracts HTMX data from the request
|
||||||
func GetRequest(ctx echo.Context) Request {
|
func GetRequest(ctx echo.Context) Request {
|
||||||
return Request{
|
return Request{
|
||||||
Enabled: ctx.Request().Header.Get(HeaderRequest) == "true",
|
Enabled: ctx.Request().Header.Get(HeaderRequest) == "true",
|
||||||
Boosted: ctx.Request().Header.Get(HeaderBoosted) == "true",
|
Boosted: ctx.Request().Header.Get(HeaderBoosted) == "true",
|
||||||
Trigger: ctx.Request().Header.Get(HeaderTrigger),
|
Trigger: ctx.Request().Header.Get(HeaderTrigger),
|
||||||
TriggerName: ctx.Request().Header.Get(HeaderTriggerName),
|
TriggerName: ctx.Request().Header.Get(HeaderTriggerName),
|
||||||
Target: ctx.Request().Header.Get(HeaderTarget),
|
Target: ctx.Request().Header.Get(HeaderTarget),
|
||||||
Prompt: ctx.Request().Header.Get(HeaderPrompt),
|
Prompt: ctx.Request().Header.Get(HeaderPrompt),
|
||||||
|
HistoryRestore: ctx.Request().Header.Get(HeaderHistoryRestoreRequest) == "true",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply applies data from a Response to a server response
|
// Apply applies data from a Response to a server response
|
||||||
func (r Response) Apply(ctx echo.Context) {
|
func (r Response) Apply(ctx echo.Context) {
|
||||||
if r.Push != "" {
|
if r.PushURL != "" {
|
||||||
ctx.Response().Header().Set(HeaderPush, r.Push)
|
ctx.Response().Header().Set(HeaderPushURL, r.PushURL)
|
||||||
}
|
}
|
||||||
if r.Redirect != "" {
|
if r.Redirect != "" {
|
||||||
ctx.Response().Header().Set(HeaderRedirect, r.Redirect)
|
ctx.Response().Header().Set(HeaderRedirect, r.Redirect)
|
||||||
@ -76,6 +85,9 @@ func (r Response) Apply(ctx echo.Context) {
|
|||||||
if r.TriggerAfterSettle != "" {
|
if r.TriggerAfterSettle != "" {
|
||||||
ctx.Response().Header().Set(HeaderTriggerAfterSettle, r.TriggerAfterSettle)
|
ctx.Response().Header().Set(HeaderTriggerAfterSettle, r.TriggerAfterSettle)
|
||||||
}
|
}
|
||||||
|
if r.ReplaceURL != "" {
|
||||||
|
ctx.Response().Header().Set(HeaderReplaceURL, r.ReplaceURL)
|
||||||
|
}
|
||||||
if r.NoContent {
|
if r.NoContent {
|
||||||
ctx.Response().Status = http.StatusNoContent
|
ctx.Response().Status = http.StatusNoContent
|
||||||
}
|
}
|
||||||
|
@ -19,10 +19,12 @@ func TestSetRequest(t *testing.T) {
|
|||||||
ctx.Request().Header.Set(HeaderTriggerName, "b")
|
ctx.Request().Header.Set(HeaderTriggerName, "b")
|
||||||
ctx.Request().Header.Set(HeaderTarget, "c")
|
ctx.Request().Header.Set(HeaderTarget, "c")
|
||||||
ctx.Request().Header.Set(HeaderPrompt, "d")
|
ctx.Request().Header.Set(HeaderPrompt, "d")
|
||||||
|
ctx.Request().Header.Set(HeaderHistoryRestoreRequest, "true")
|
||||||
|
|
||||||
r := GetRequest(ctx)
|
r := GetRequest(ctx)
|
||||||
assert.Equal(t, true, r.Enabled)
|
assert.Equal(t, true, r.Enabled)
|
||||||
assert.Equal(t, true, r.Boosted)
|
assert.Equal(t, true, r.Boosted)
|
||||||
|
assert.Equal(t, true, r.HistoryRestore)
|
||||||
assert.Equal(t, "a", r.Trigger)
|
assert.Equal(t, "a", r.Trigger)
|
||||||
assert.Equal(t, "b", r.TriggerName)
|
assert.Equal(t, "b", r.TriggerName)
|
||||||
assert.Equal(t, "c", r.Target)
|
assert.Equal(t, "c", r.Target)
|
||||||
@ -32,8 +34,9 @@ func TestSetRequest(t *testing.T) {
|
|||||||
func TestResponse_Apply(t *testing.T) {
|
func TestResponse_Apply(t *testing.T) {
|
||||||
ctx, _ := tests.NewContext(echo.New(), "/")
|
ctx, _ := tests.NewContext(echo.New(), "/")
|
||||||
r := Response{
|
r := Response{
|
||||||
Push: "a",
|
PushURL: "a",
|
||||||
Redirect: "b",
|
Redirect: "b",
|
||||||
|
ReplaceURL: "f",
|
||||||
Refresh: true,
|
Refresh: true,
|
||||||
Trigger: "c",
|
Trigger: "c",
|
||||||
TriggerAfterSwap: "d",
|
TriggerAfterSwap: "d",
|
||||||
@ -42,11 +45,12 @@ func TestResponse_Apply(t *testing.T) {
|
|||||||
}
|
}
|
||||||
r.Apply(ctx)
|
r.Apply(ctx)
|
||||||
|
|
||||||
assert.Equal(t, "a", ctx.Response().Header().Get(HeaderPush))
|
assert.Equal(t, "a", ctx.Response().Header().Get(HeaderPushURL))
|
||||||
assert.Equal(t, "b", ctx.Response().Header().Get(HeaderRedirect))
|
assert.Equal(t, "b", ctx.Response().Header().Get(HeaderRedirect))
|
||||||
assert.Equal(t, "true", ctx.Response().Header().Get(HeaderRefresh))
|
assert.Equal(t, "true", ctx.Response().Header().Get(HeaderRefresh))
|
||||||
assert.Equal(t, "c", ctx.Response().Header().Get(HeaderTrigger))
|
assert.Equal(t, "c", ctx.Response().Header().Get(HeaderTrigger))
|
||||||
assert.Equal(t, "d", ctx.Response().Header().Get(HeaderTriggerAfterSwap))
|
assert.Equal(t, "d", ctx.Response().Header().Get(HeaderTriggerAfterSwap))
|
||||||
assert.Equal(t, "e", ctx.Response().Header().Get(HeaderTriggerAfterSettle))
|
assert.Equal(t, "e", ctx.Response().Header().Get(HeaderTriggerAfterSettle))
|
||||||
|
assert.Equal(t, "f", ctx.Response().Header().Get(HeaderReplaceURL))
|
||||||
assert.Equal(t, http.StatusNoContent, ctx.Response().Status)
|
assert.Equal(t, http.StatusNoContent, ctx.Response().Status)
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
{{define "js"}}
|
{{define "js"}}
|
||||||
<script src="https://unpkg.com/htmx.org@1.9.3"></script>
|
<script src="https://unpkg.com/htmx.org@2.0.0/dist/htmx.min.js"></script>
|
||||||
<script defer src="https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js"></script>
|
<script defer src="https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js"></script>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user