From 0343581099d4de38b7583a2371f3af40c7516aa9 Mon Sep 17 00:00:00 2001 From: Tony Grosinger Date: Wed, 17 Jul 2024 19:58:58 -0700 Subject: [PATCH] Convert task page to Templ --- pkg/handlers/task.go | 23 +++-- templ/pages/task.templ | 55 ++++++++++ templ/pages/task_templ.go | 194 ++++++++++++++++++++++++++++++++++++ templates/pages/task.gohtml | 43 -------- 4 files changed, 262 insertions(+), 53 deletions(-) create mode 100644 templ/pages/task.templ create mode 100644 templ/pages/task_templ.go delete mode 100644 templates/pages/task.gohtml diff --git a/pkg/handlers/task.go b/pkg/handlers/task.go index 83ae470..9a4ed2a 100644 --- a/pkg/handlers/task.go +++ b/pkg/handlers/task.go @@ -4,6 +4,7 @@ import ( "fmt" "time" + "github.com/a-h/templ" "github.com/go-playground/validator/v10" "github.com/labstack/echo/v4" @@ -12,6 +13,8 @@ import ( "git.grosinger.net/tgrosinger/saasitone/pkg/page" "git.grosinger.net/tgrosinger/saasitone/pkg/services" "git.grosinger.net/tgrosinger/saasitone/pkg/tasks" + "git.grosinger.net/tgrosinger/saasitone/templ/layouts" + "git.grosinger.net/tgrosinger/saasitone/templ/pages" "git.grosinger.net/tgrosinger/saasitone/templates" ) @@ -25,12 +28,6 @@ type ( tasks *services.TaskClient *services.TemplateRenderer } - - taskForm struct { - Delay int `form:"delay" validate:"gte=0"` - Message string `form:"message" validate:"required"` - form.Submission - } ) func init() { @@ -50,16 +47,22 @@ func (h *Task) Routes(g *echo.Group) { func (h *Task) Page(ctx echo.Context) error { p := page.New(ctx) - p.Layout = templates.LayoutMain p.Name = templates.PageTask p.Title = "Create a task" - p.Form = form.Get[taskForm](ctx) - return h.RenderPage(ctx, p) + f := form.Get[pages.TaskForm](ctx) + component := pages.Task(p, f) + + // TODO: This can be reused + p.LayoutComponent = func(content templ.Component) templ.Component { + return layouts.Main(p, content) + } + + return h.RenderPageTempl(ctx, p, component) } func (h *Task) Submit(ctx echo.Context) error { - var input taskForm + var input pages.TaskForm err := form.Submit(ctx, &input) diff --git a/templ/pages/task.templ b/templ/pages/task.templ new file mode 100644 index 0000000..80d0a9f --- /dev/null +++ b/templ/pages/task.templ @@ -0,0 +1,55 @@ +package pages + +import ( + "strconv" + + "git.grosinger.net/tgrosinger/saasitone/templ/components" + "git.grosinger.net/tgrosinger/saasitone/pkg/form" + "git.grosinger.net/tgrosinger/saasitone/pkg/page" +) + +type TaskForm struct { + Delay int `form:"delay" validate:"gte=0"` + Message string `form:"message" validate:"required"` + form.Submission +} + +templ Task(p page.Page, f *TaskForm) { + if p.HTMX.Request.Target != "task" { + + } + @taskForm(p, f) +} + +templ taskForm(p page.Page, f *TaskForm) { +
+ @components.Messages(p) +
+ +
+ +
+

How long to wait until the task is executed

+ @components.FieldErrors(f.Submission.GetFieldErrors("Delay")) +
+
+ +
+ +
+

The message the task will output to the log

+ @components.FieldErrors(f.Submission.GetFieldErrors("Message")) +
+
+
+ +
+
+ @components.CSRF(p.CSRF) +
+} diff --git a/templ/pages/task_templ.go b/templ/pages/task_templ.go new file mode 100644 index 0000000..3ee8fb2 --- /dev/null +++ b/templ/pages/task_templ.go @@ -0,0 +1,194 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.2.707 +package pages + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import "context" +import "io" +import "bytes" + +import ( + "strconv" + + "git.grosinger.net/tgrosinger/saasitone/pkg/form" + "git.grosinger.net/tgrosinger/saasitone/pkg/page" + "git.grosinger.net/tgrosinger/saasitone/templ/components" +) + +type TaskForm struct { + Delay int `form:"delay" validate:"gte=0"` + Message string `form:"message" validate:"required"` + form.Submission +} + +func Task(p page.Page, f *TaskForm) templ.Component { + return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) + if !templ_7745c5c3_IsBuffer { + templ_7745c5c3_Buffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templ_7745c5c3_Buffer) + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + if p.HTMX.Request.Target != "task" { + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("

Submitting this form will create an ExampleTask in the task queue. After the specified delay, the message will be logged by the queue processor.

See pkg/tasks and the README for more information.

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = taskForm(p, f).Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if !templ_7745c5c3_IsBuffer { + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W) + } + return templ_7745c5c3_Err + }) +} + +func taskForm(p page.Page, f *TaskForm) templ.Component { + return templ.ComponentFunc(func(ctx context.Context, templ_7745c5c3_W io.Writer) (templ_7745c5c3_Err error) { + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templ_7745c5c3_W.(*bytes.Buffer) + if !templ_7745c5c3_IsBuffer { + templ_7745c5c3_Buffer = templ.GetBuffer() + defer templ.ReleaseBuffer(templ_7745c5c3_Buffer) + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var2 := templ.GetChildren(ctx) + if templ_7745c5c3_Var2 == nil { + templ_7745c5c3_Var2 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = components.Messages(p).Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var4 = []any{"input", f.Submission.GetFieldStatusClass("Delay")} + templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var4...) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("

How long to wait until the task is executed

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = components.FieldErrors(f.Submission.GetFieldErrors("Delay")).Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var7 = []any{"textarea", f.Submission.GetFieldStatusClass("Message")} + templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var7...) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("

The message the task will output to the log

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = components.FieldErrors(f.Submission.GetFieldErrors("Message")).Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = components.CSRF(p.CSRF).Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if !templ_7745c5c3_IsBuffer { + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteTo(templ_7745c5c3_W) + } + return templ_7745c5c3_Err + }) +} diff --git a/templates/pages/task.gohtml b/templates/pages/task.gohtml deleted file mode 100644 index 6436c48..0000000 --- a/templates/pages/task.gohtml +++ /dev/null @@ -1,43 +0,0 @@ -{{define "content"}} - {{- if not (eq .HTMX.Request.Target "task")}} - - {{- end}} - - {{template "form" .}} -{{end}} - -{{define "form"}} -
- {{template "messages" .}} -
- -
- -
-

How long to wait until the task is executed

- {{template "field-errors" (.Form.GetFieldErrors "Delay")}} -
- -
- -
- -
-

The message the task will output to the log

- {{template "field-errors" (.Form.GetFieldErrors "Message")}} -
- -
-
- -
-
- - {{template "csrf" .}} -
-{{end}} \ No newline at end of file