diff --git a/ent/admin/handler.go b/ent/admin/handler.go index f4fce9e..fdcbc50 100644 --- a/ent/admin/handler.go +++ b/ent/admin/handler.go @@ -83,7 +83,7 @@ func (h *Handler) List(ctx echo.Context, entityType string) (*EntityList, error) func (h *Handler) PasswordTokenCreate(ctx echo.Context) error { var payload PasswordToken - if err := ctx.Bind(&payload); err != nil { + if err := h.bind(ctx, &payload); err != nil { return err } @@ -103,7 +103,7 @@ func (h *Handler) PasswordTokenUpdate(ctx echo.Context, id int) error { } var payload PasswordToken - if err = ctx.Bind(&payload); err != nil { + if err = h.bind(ctx, &payload); err != nil { return err } @@ -167,7 +167,7 @@ func (h *Handler) PasswordTokenGet(ctx echo.Context, id int) error { func (h *Handler) UserCreate(ctx echo.Context) error { var payload User - if err := ctx.Bind(&payload); err != nil { + if err := h.bind(ctx, &payload); err != nil { return err } @@ -188,7 +188,7 @@ func (h *Handler) UserUpdate(ctx echo.Context, id int) error { } var payload User - if err = ctx.Bind(&payload); err != nil { + if err = h.bind(ctx, &payload); err != nil { return err } @@ -262,3 +262,14 @@ func (h *Handler) getOffset(ctx echo.Context) int { } 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) +} diff --git a/ent/admin/templates/handler.tmpl b/ent/admin/templates/handler.tmpl index 0e1b9cf..c5dbc66 100644 --- a/ent/admin/templates/handler.tmpl +++ b/ent/admin/templates/handler.tmpl @@ -90,7 +90,7 @@ {{ range $n := $.Nodes }} func (h *Handler) {{ $n.Name }}Create(ctx echo.Context) error { var payload {{ $n.Name }} - if err := ctx.Bind(&payload); err != nil { + if err := h.bind(ctx, &payload); err != nil { return err } @@ -114,7 +114,7 @@ } var payload {{ $n.Name }} - if err = ctx.Bind(&payload); err != nil { + if err = h.bind(ctx, &payload); err != nil { return err } @@ -204,4 +204,15 @@ 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 }} \ No newline at end of file diff --git a/ent/admin/templates/types.tmpl b/ent/admin/templates/types.tmpl index 6a55262..5adea0d 100644 --- a/ent/admin/templates/types.tmpl +++ b/ent/admin/templates/types.tmpl @@ -8,7 +8,7 @@ {{ range $n := $.Nodes }} type {{ $n.Name }} struct { {{- range $f := $n.Fields }} - {{ fieldName $f.Name }} {{ $f.Type }} `form:"{{ $f.Name }}"` + {{ fieldName $f.Name }} {{ $f.Type }} `form:"{{ $f.Name }}"` {{- end }} } {{ end }} diff --git a/pkg/handlers/admin.go b/pkg/handlers/admin.go index cde84f1..6c4f4e2 100644 --- a/pkg/handlers/admin.go +++ b/pkg/handlers/admin.go @@ -151,10 +151,11 @@ func (h *Admin) EntityDeleteSubmit(n *gen.Type) echo.HandlerFunc { return func(ctx echo.Context) error { id := ctx.Get(entityIDContextKey).(int) 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. New(ctx). diff --git a/pkg/services/container_test.go b/pkg/services/container_test.go index 7f4a5d4..1e0bd24 100644 --- a/pkg/services/container_test.go +++ b/pkg/services/container_test.go @@ -17,4 +17,8 @@ func TestNewContainer(t *testing.T) { assert.NotNil(t, c.Mail) assert.NotNil(t, c.Auth) assert.NotNil(t, c.Tasks) + g := c.Graph + if g == nil { + + } } diff --git a/pkg/ui/pages/entity.go b/pkg/ui/pages/entity.go index 8ef9add..a0c2b2d 100644 --- a/pkg/ui/pages/entity.go +++ b/pkg/ui/pages/entity.go @@ -68,6 +68,7 @@ func AdminEntityForm(ctx echo.Context, schema *load.Schema, values url.Values) e for _, f := range schema.Fields { // TODO cardinality? // TODO optional fields? + // TODO password? switch f.Info.Type { case field.TypeString: 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)), Value: getValue(f.Name), })) - case field.TypeInt, field.TypeInt8, field.TypeInt16, field.TypeInt32, - field.TypeInt64, field.TypeFloat32, field.TypeFloat64: + case field.TypeInt, field.TypeInt8, field.TypeInt16, field.TypeInt32, field.TypeInt64, + field.TypeFloat32, field.TypeFloat64: nodes = append(nodes, InputField(InputFieldParams{ Name: f.Name, InputType: "number", @@ -95,8 +96,9 @@ func AdminEntityForm(ctx echo.Context, schema *load.Schema, values url.Values) e })) case field.TypeBool: nodes = append(nodes, Checkbox(CheckboxParams{ - Name: f.Name, - Label: label(f.Name), + Name: f.Name, + Label: label(f.Name), + Checked: getValue(f.Name) != "", })) case field.TypeEnum: // TODO