diff --git a/pkg/htmx/htmx.go b/pkg/htmx/htmx.go index b14c76d..cabc918 100644 --- a/pkg/htmx/htmx.go +++ b/pkg/htmx/htmx.go @@ -6,37 +6,45 @@ import ( "github.com/labstack/echo/v4" ) -// Headers (https://htmx.org/docs/#requests) +// Request headers: https://htmx.org/docs/#request-headers const ( - HeaderRequest = "HX-Request" - HeaderBoosted = "HX-Boosted" - HeaderTrigger = "HX-Trigger" - HeaderTriggerName = "HX-Trigger-Name" - HeaderTriggerAfterSwap = "HX-Trigger-After-Swap" - HeaderTriggerAfterSettle = "HX-Trigger-After-Settle" - HeaderTarget = "HX-Target" - HeaderPrompt = "HX-Prompt" - HeaderPush = "HX-Push" + HeaderBoosted = "HX-Boosted" + HeaderHistoryRestoreRequest = "HX-History-Restore-Request" + HeaderPrompt = "HX-Prompt" + HeaderRequest = "HX-Request" + HeaderTarget = "HX-Target" + HeaderTrigger = "HX-Trigger" + HeaderTriggerName = "HX-Trigger-Name" +) + +// Response headers: https://htmx.org/docs/#response-headers +const ( + HeaderPushURL = "HX-Push-Url" HeaderRedirect = "HX-Redirect" + HeaderReplaceURL = "HX-Replace-Url" HeaderRefresh = "HX-Refresh" + HeaderTriggerAfterSettle = "HX-Trigger-After-Settle" + HeaderTriggerAfterSwap = "HX-Trigger-After-Swap" ) type ( // Request contains data that HTMX provides during requests Request struct { - Enabled bool - Boosted bool - Trigger string - TriggerName string - Target string - Prompt string + Enabled bool + Boosted bool + HistoryRestore bool + Trigger string + TriggerName string + Target string + Prompt string } // Response contain data that the server can communicate back to HTMX Response struct { - Push string + PushURL string Redirect string Refresh bool + ReplaceURL string Trigger string TriggerAfterSwap string TriggerAfterSettle string @@ -47,19 +55,20 @@ type ( // GetRequest extracts HTMX data from the request func GetRequest(ctx echo.Context) Request { return Request{ - Enabled: ctx.Request().Header.Get(HeaderRequest) == "true", - Boosted: ctx.Request().Header.Get(HeaderBoosted) == "true", - Trigger: ctx.Request().Header.Get(HeaderTrigger), - TriggerName: ctx.Request().Header.Get(HeaderTriggerName), - Target: ctx.Request().Header.Get(HeaderTarget), - Prompt: ctx.Request().Header.Get(HeaderPrompt), + Enabled: ctx.Request().Header.Get(HeaderRequest) == "true", + Boosted: ctx.Request().Header.Get(HeaderBoosted) == "true", + Trigger: ctx.Request().Header.Get(HeaderTrigger), + TriggerName: ctx.Request().Header.Get(HeaderTriggerName), + Target: ctx.Request().Header.Get(HeaderTarget), + Prompt: ctx.Request().Header.Get(HeaderPrompt), + HistoryRestore: ctx.Request().Header.Get(HeaderHistoryRestoreRequest) == "true", } } // Apply applies data from a Response to a server response func (r Response) Apply(ctx echo.Context) { - if r.Push != "" { - ctx.Response().Header().Set(HeaderPush, r.Push) + if r.PushURL != "" { + ctx.Response().Header().Set(HeaderPushURL, r.PushURL) } if r.Redirect != "" { ctx.Response().Header().Set(HeaderRedirect, r.Redirect) @@ -76,6 +85,9 @@ func (r Response) Apply(ctx echo.Context) { if r.TriggerAfterSettle != "" { ctx.Response().Header().Set(HeaderTriggerAfterSettle, r.TriggerAfterSettle) } + if r.ReplaceURL != "" { + ctx.Response().Header().Set(HeaderReplaceURL, r.ReplaceURL) + } if r.NoContent { ctx.Response().Status = http.StatusNoContent } diff --git a/pkg/htmx/htmx_test.go b/pkg/htmx/htmx_test.go index 84ef4cb..93fa06e 100644 --- a/pkg/htmx/htmx_test.go +++ b/pkg/htmx/htmx_test.go @@ -19,10 +19,12 @@ func TestSetRequest(t *testing.T) { ctx.Request().Header.Set(HeaderTriggerName, "b") ctx.Request().Header.Set(HeaderTarget, "c") ctx.Request().Header.Set(HeaderPrompt, "d") + ctx.Request().Header.Set(HeaderHistoryRestoreRequest, "true") r := GetRequest(ctx) assert.Equal(t, true, r.Enabled) assert.Equal(t, true, r.Boosted) + assert.Equal(t, true, r.HistoryRestore) assert.Equal(t, "a", r.Trigger) assert.Equal(t, "b", r.TriggerName) assert.Equal(t, "c", r.Target) @@ -32,8 +34,9 @@ func TestSetRequest(t *testing.T) { func TestResponse_Apply(t *testing.T) { ctx, _ := tests.NewContext(echo.New(), "/") r := Response{ - Push: "a", + PushURL: "a", Redirect: "b", + ReplaceURL: "f", Refresh: true, Trigger: "c", TriggerAfterSwap: "d", @@ -42,11 +45,12 @@ func TestResponse_Apply(t *testing.T) { } 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, "true", ctx.Response().Header().Get(HeaderRefresh)) assert.Equal(t, "c", ctx.Response().Header().Get(HeaderTrigger)) assert.Equal(t, "d", ctx.Response().Header().Get(HeaderTriggerAfterSwap)) 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) } diff --git a/templates/components/core.gohtml b/templates/components/core.gohtml index f795bbc..0eb2f69 100644 --- a/templates/components/core.gohtml +++ b/templates/components/core.gohtml @@ -17,7 +17,7 @@ {{end}} {{define "js"}} - + {{end}}