Only bind form field values that are not empty.
This commit is contained in:
parent
271e252c53
commit
356cf21b3e
6 changed files with 42 additions and 13 deletions
|
|
@ -83,7 +83,7 @@ func (h *Handler) List(ctx echo.Context, entityType string) (*EntityList, error)
|
||||||
|
|
||||||
func (h *Handler) PasswordTokenCreate(ctx echo.Context) error {
|
func (h *Handler) PasswordTokenCreate(ctx echo.Context) error {
|
||||||
var payload PasswordToken
|
var payload PasswordToken
|
||||||
if err := ctx.Bind(&payload); err != nil {
|
if err := h.bind(ctx, &payload); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -103,7 +103,7 @@ func (h *Handler) PasswordTokenUpdate(ctx echo.Context, id int) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
var payload PasswordToken
|
var payload PasswordToken
|
||||||
if err = ctx.Bind(&payload); err != nil {
|
if err = h.bind(ctx, &payload); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -167,7 +167,7 @@ func (h *Handler) PasswordTokenGet(ctx echo.Context, id int) error {
|
||||||
|
|
||||||
func (h *Handler) UserCreate(ctx echo.Context) error {
|
func (h *Handler) UserCreate(ctx echo.Context) error {
|
||||||
var payload User
|
var payload User
|
||||||
if err := ctx.Bind(&payload); err != nil {
|
if err := h.bind(ctx, &payload); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -188,7 +188,7 @@ func (h *Handler) UserUpdate(ctx echo.Context, id int) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
var payload User
|
var payload User
|
||||||
if err = ctx.Bind(&payload); err != nil {
|
if err = h.bind(ctx, &payload); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -262,3 +262,14 @@ func (h *Handler) getOffset(ctx echo.Context) int {
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *Handler) bind(ctx echo.Context, entity any) error {
|
||||||
|
// Remove empty field values so Echo's bind does to fail when trying to parse things like
|
||||||
|
// times, etc.
|
||||||
|
for k, v := range ctx.Request().Form {
|
||||||
|
if len(v) == 1 && len(v[0]) == 0 {
|
||||||
|
delete(ctx.Request().Form, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ctx.Bind(entity)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,7 @@
|
||||||
{{ range $n := $.Nodes }}
|
{{ range $n := $.Nodes }}
|
||||||
func (h *Handler) {{ $n.Name }}Create(ctx echo.Context) error {
|
func (h *Handler) {{ $n.Name }}Create(ctx echo.Context) error {
|
||||||
var payload {{ $n.Name }}
|
var payload {{ $n.Name }}
|
||||||
if err := ctx.Bind(&payload); err != nil {
|
if err := h.bind(ctx, &payload); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -114,7 +114,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
var payload {{ $n.Name }}
|
var payload {{ $n.Name }}
|
||||||
if err = ctx.Bind(&payload); err != nil {
|
if err = h.bind(ctx, &payload); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -204,4 +204,15 @@
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *Handler) bind(ctx echo.Context, entity any) error {
|
||||||
|
// Remove empty field values so Echo's bind does to fail when trying to parse things like
|
||||||
|
// times, etc.
|
||||||
|
for k, v := range ctx.Request().Form {
|
||||||
|
if len(v) == 1 && len(v[0]) == 0 {
|
||||||
|
delete(ctx.Request().Form, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ctx.Bind(entity)
|
||||||
|
}
|
||||||
|
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
{{ range $n := $.Nodes }}
|
{{ range $n := $.Nodes }}
|
||||||
type {{ $n.Name }} struct {
|
type {{ $n.Name }} struct {
|
||||||
{{- range $f := $n.Fields }}
|
{{- range $f := $n.Fields }}
|
||||||
{{ fieldName $f.Name }} {{ $f.Type }} `form:"{{ $f.Name }}"`
|
{{ fieldName $f.Name }} {{ $f.Type }} `form:"{{ $f.Name }}"`
|
||||||
{{- end }}
|
{{- end }}
|
||||||
}
|
}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
|
||||||
|
|
@ -151,10 +151,11 @@ func (h *Admin) EntityDeleteSubmit(n *gen.Type) echo.HandlerFunc {
|
||||||
return func(ctx echo.Context) error {
|
return func(ctx echo.Context) error {
|
||||||
id := ctx.Get(entityIDContextKey).(int)
|
id := ctx.Get(entityIDContextKey).(int)
|
||||||
if err := h.admin.Delete(ctx, n.Name, id); err != nil {
|
if err := h.admin.Delete(ctx, n.Name, id); err != nil {
|
||||||
return fail(err, fmt.Sprintf("failed to delete %s (ID: %d)", n.Name, id))
|
msg.Danger(ctx, err.Error())
|
||||||
|
return h.EntityDelete(n)(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
msg.Success(ctx, fmt.Sprintf("Successfully deleted %s ID %d.", n.Name, id))
|
msg.Success(ctx, fmt.Sprintf("Successfully deleted %s (ID %d).", n.Name, id))
|
||||||
|
|
||||||
return redirect.
|
return redirect.
|
||||||
New(ctx).
|
New(ctx).
|
||||||
|
|
|
||||||
|
|
@ -17,4 +17,8 @@ func TestNewContainer(t *testing.T) {
|
||||||
assert.NotNil(t, c.Mail)
|
assert.NotNil(t, c.Mail)
|
||||||
assert.NotNil(t, c.Auth)
|
assert.NotNil(t, c.Auth)
|
||||||
assert.NotNil(t, c.Tasks)
|
assert.NotNil(t, c.Tasks)
|
||||||
|
g := c.Graph
|
||||||
|
if g == nil {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -68,6 +68,7 @@ func AdminEntityForm(ctx echo.Context, schema *load.Schema, values url.Values) e
|
||||||
for _, f := range schema.Fields {
|
for _, f := range schema.Fields {
|
||||||
// TODO cardinality?
|
// TODO cardinality?
|
||||||
// TODO optional fields?
|
// TODO optional fields?
|
||||||
|
// TODO password?
|
||||||
switch f.Info.Type {
|
switch f.Info.Type {
|
||||||
case field.TypeString:
|
case field.TypeString:
|
||||||
nodes = append(nodes, InputField(InputFieldParams{
|
nodes = append(nodes, InputField(InputFieldParams{
|
||||||
|
|
@ -85,8 +86,8 @@ func AdminEntityForm(ctx echo.Context, schema *load.Schema, values url.Values) e
|
||||||
Help: fmt.Sprintf("Use the following format: %s", time.Now().Format(time.RFC3339)),
|
Help: fmt.Sprintf("Use the following format: %s", time.Now().Format(time.RFC3339)),
|
||||||
Value: getValue(f.Name),
|
Value: getValue(f.Name),
|
||||||
}))
|
}))
|
||||||
case field.TypeInt, field.TypeInt8, field.TypeInt16, field.TypeInt32,
|
case field.TypeInt, field.TypeInt8, field.TypeInt16, field.TypeInt32, field.TypeInt64,
|
||||||
field.TypeInt64, field.TypeFloat32, field.TypeFloat64:
|
field.TypeFloat32, field.TypeFloat64:
|
||||||
nodes = append(nodes, InputField(InputFieldParams{
|
nodes = append(nodes, InputField(InputFieldParams{
|
||||||
Name: f.Name,
|
Name: f.Name,
|
||||||
InputType: "number",
|
InputType: "number",
|
||||||
|
|
@ -95,8 +96,9 @@ func AdminEntityForm(ctx echo.Context, schema *load.Schema, values url.Values) e
|
||||||
}))
|
}))
|
||||||
case field.TypeBool:
|
case field.TypeBool:
|
||||||
nodes = append(nodes, Checkbox(CheckboxParams{
|
nodes = append(nodes, Checkbox(CheckboxParams{
|
||||||
Name: f.Name,
|
Name: f.Name,
|
||||||
Label: label(f.Name),
|
Label: label(f.Name),
|
||||||
|
Checked: getValue(f.Name) != "",
|
||||||
}))
|
}))
|
||||||
case field.TypeEnum:
|
case field.TypeEnum:
|
||||||
// TODO
|
// TODO
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue