Migrate from templates to Gomponents (#103)
This commit is contained in:
parent
0bf9ab7189
commit
051d032038
104 changed files with 2768 additions and 2824 deletions
|
|
@ -5,7 +5,7 @@ import (
|
|||
"github.com/mikestefanello/pagoda/pkg/context"
|
||||
)
|
||||
|
||||
// Form represents a form that can be submitted and validated
|
||||
// Form represents a form that can be submitted and validated.
|
||||
type Form interface {
|
||||
// Submit marks the form as submitted, stores a pointer to it in the context, binds the request
|
||||
// values to the struct fields, and validates the input based on the struct tags.
|
||||
|
|
@ -13,29 +13,26 @@ type Form interface {
|
|||
// Returns an echo.HTTPError if the request failed to process.
|
||||
Submit(c echo.Context, form any) error
|
||||
|
||||
// IsSubmitted returns true if the form was submitted
|
||||
// IsSubmitted returns true if the form was submitted.
|
||||
IsSubmitted() bool
|
||||
|
||||
// IsValid returns true if the form has no validation errors
|
||||
// IsValid returns true if the form has no validation errors.
|
||||
IsValid() bool
|
||||
|
||||
// IsDone returns true if the form was submitted and has no validation errors
|
||||
// IsDone returns true if the form was submitted and has no validation errors.
|
||||
IsDone() bool
|
||||
|
||||
// FieldHasErrors returns true if a given struct field has validation errors
|
||||
// FieldHasErrors returns true if a given struct field has validation errors.
|
||||
FieldHasErrors(fieldName string) bool
|
||||
|
||||
// SetFieldError sets a validation error message for a given struct field
|
||||
// SetFieldError sets a validation error message for a given struct field.
|
||||
SetFieldError(fieldName string, message string)
|
||||
|
||||
// GetFieldErrors returns the validation errors for a given struct field
|
||||
// GetFieldErrors returns the validation errors for a given struct field.
|
||||
GetFieldErrors(fieldName string) []string
|
||||
|
||||
// GetFieldStatusClass returns a CSS class to be used for a given struct field
|
||||
GetFieldStatusClass(fieldName string) string
|
||||
}
|
||||
|
||||
// Get gets a form from the context or initializes a new copy if one is not set
|
||||
// Get gets a form from the context or initializes a new copy if one is not set.
|
||||
func Get[T any](ctx echo.Context) *T {
|
||||
if v := ctx.Get(context.FormKey); v != nil {
|
||||
return v.(*T)
|
||||
|
|
@ -44,13 +41,13 @@ func Get[T any](ctx echo.Context) *T {
|
|||
return &v
|
||||
}
|
||||
|
||||
// Clear removes the form set in the context
|
||||
// Clear removes the form set in the context.
|
||||
func Clear(ctx echo.Context) {
|
||||
ctx.Set(context.FormKey, nil)
|
||||
}
|
||||
|
||||
// Submit submits a form
|
||||
// See Form.Submit()
|
||||
// Submit submits a form.
|
||||
// See Form.Submit().
|
||||
func Submit(ctx echo.Context, form Form) error {
|
||||
return form.Submit(ctx, form)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,25 +13,25 @@ import (
|
|||
// Submission represents the state of the submission of a form, not including the form itself.
|
||||
// This satisfies the Form interface.
|
||||
type Submission struct {
|
||||
// isSubmitted indicates if the form has been submitted
|
||||
// isSubmitted indicates if the form has been submitted.
|
||||
isSubmitted bool
|
||||
|
||||
// errors stores a slice of error message strings keyed by form struct field name
|
||||
// errors stores a slice of error message strings keyed by form struct field name.
|
||||
errors map[string][]string
|
||||
}
|
||||
|
||||
func (f *Submission) Submit(ctx echo.Context, form any) error {
|
||||
f.isSubmitted = true
|
||||
|
||||
// Set in context so the form can later be retrieved
|
||||
// Set in context so the form can later be retrieved.
|
||||
ctx.Set(context.FormKey, form)
|
||||
|
||||
// Bind the values from the incoming request to the form struct
|
||||
// Bind the values from the incoming request to the form struct.
|
||||
if err := ctx.Bind(form); err != nil {
|
||||
return echo.NewHTTPError(http.StatusInternalServerError, fmt.Sprintf("unable to bind form: %v", err))
|
||||
}
|
||||
|
||||
// Validate the form
|
||||
// Validate the form.
|
||||
if err := ctx.Validate(form); err != nil {
|
||||
f.setErrorMessages(err)
|
||||
return err
|
||||
|
|
@ -73,17 +73,7 @@ func (f *Submission) GetFieldErrors(fieldName string) []string {
|
|||
return f.errors[fieldName]
|
||||
}
|
||||
|
||||
func (f *Submission) GetFieldStatusClass(fieldName string) string {
|
||||
if f.isSubmitted {
|
||||
if f.FieldHasErrors(fieldName) {
|
||||
return "is-danger"
|
||||
}
|
||||
return "is-success"
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// setErrorMessages sets errors messages on the submission for all fields that failed validation
|
||||
// setErrorMessages sets errors messages on the submission for all fields that failed validation.
|
||||
func (f *Submission) setErrorMessages(err error) {
|
||||
// Only this is supported right now
|
||||
ves, ok := err.(validator.ValidationErrors)
|
||||
|
|
@ -94,8 +84,8 @@ func (f *Submission) setErrorMessages(err error) {
|
|||
for _, ve := range ves {
|
||||
var message string
|
||||
|
||||
// Provide better error messages depending on the failed validation tag
|
||||
// This should be expanded as you use additional tags in your validation
|
||||
// Provide better error messages depending on the failed validation tag.
|
||||
// This should be expanded as you use additional tags in your validation.
|
||||
switch ve.Tag() {
|
||||
case "required":
|
||||
message = "This field is required."
|
||||
|
|
@ -109,7 +99,7 @@ func (f *Submission) setErrorMessages(err error) {
|
|||
message = "Invalid value."
|
||||
}
|
||||
|
||||
// Add the error
|
||||
// Add the error.
|
||||
f.SetFieldError(ve.Field(), message)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,8 +40,6 @@ func TestFormSubmission(t *testing.T) {
|
|||
require.Len(t, form.GetFieldErrors("Name"), 1)
|
||||
assert.Len(t, form.GetFieldErrors("Email"), 0)
|
||||
assert.Equal(t, "This field is required.", form.GetFieldErrors("Name")[0])
|
||||
assert.Equal(t, "is-danger", form.GetFieldStatusClass("Name"))
|
||||
assert.Equal(t, "is-success", form.GetFieldStatusClass("Email"))
|
||||
assert.False(t, form.IsDone())
|
||||
|
||||
formInCtx := Get[formTest](ctx)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue