Upgrade to HTMX 2.0.

This commit is contained in:
mikestefanello 2024-06-22 11:07:43 -04:00
parent 6da0fcb7be
commit 73098499dd
3 changed files with 44 additions and 28 deletions

View File

@ -6,19 +6,25 @@ 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"
HeaderPrompt = "HX-Prompt"
HeaderRequest = "HX-Request"
HeaderTarget = "HX-Target"
HeaderTrigger = "HX-Trigger" HeaderTrigger = "HX-Trigger"
HeaderTriggerName = "HX-Trigger-Name" HeaderTriggerName = "HX-Trigger-Name"
HeaderTriggerAfterSwap = "HX-Trigger-After-Swap" )
HeaderTriggerAfterSettle = "HX-Trigger-After-Settle"
HeaderTarget = "HX-Target" // Response headers: https://htmx.org/docs/#response-headers
HeaderPrompt = "HX-Prompt" const (
HeaderPush = "HX-Push" 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 (
@ -26,6 +32,7 @@ type (
Request struct { Request struct {
Enabled bool Enabled bool
Boosted bool Boosted bool
HistoryRestore bool
Trigger string Trigger string
TriggerName string TriggerName string
Target string Target string
@ -34,9 +41,10 @@ type (
// 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
@ -53,13 +61,14 @@ func GetRequest(ctx echo.Context) Request {
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
} }

View File

@ -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)
} }

View File

@ -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}}