diff --git a/docs/docsrc/examples/examples_presets/editing.go b/docs/docsrc/examples/examples_presets/editing.go index 587ccbeb3..1b411c12c 100644 --- a/docs/docsrc/examples/examples_presets/editing.go +++ b/docs/docsrc/examples/examples_presets/editing.go @@ -2,6 +2,7 @@ package examples_presets import ( "embed" + "errors" "fmt" "io" "net/http" @@ -187,3 +188,25 @@ func PresetsEditingValidate(b *presets.Builder, db *gorm.DB) ( return } + +func PresetsEditingSetter(b *presets.Builder, db *gorm.DB) ( + mb *presets.ModelBuilder, + cl *presets.ListingBuilder, + ce *presets.EditingBuilder, + dp *presets.DetailingBuilder, +) { + b.DataOperator(gorm2op.DataOperator(db)) + db.AutoMigrate(&Company{}) + mb = b.Model(&Company{}) + mb.Listing("ID", "Name") + eb := mb.Editing("Name") + eb.Field("Name").SetterFunc(func(obj interface{}, field *presets.FieldContext, ctx *web.EventContext) (err error) { + c := obj.(*Company) + if c.Name == "" { + return errors.New("name must not be empty") + } + return + }) + + return +} diff --git a/docs/docsrc/examples/examples_presets/editing_test.go b/docs/docsrc/examples/examples_presets/editing_test.go index 3fa11f7e4..0603440ad 100644 --- a/docs/docsrc/examples/examples_presets/editing_test.go +++ b/docs/docsrc/examples/examples_presets/editing_test.go @@ -39,3 +39,29 @@ func TestPresetsEditingValidate(t *testing.T) { }) } } + +func TestPresetsEditingSetter(t *testing.T) { + pb := presets.New().DataOperator(gorm2op.DataOperator(TestDB)) + PresetsEditingSetter(pb, TestDB) + + cases := []multipartestutils.TestCase{ + { + Name: "default field setterFunc", + Debug: true, + ReqFunc: func() *http.Request { + companyData.TruncatePut(SqlDB) + return multipartestutils.NewMultipartBuilder(). + PageURL("/companies?__execute_event__=presets_Update"). + AddField("Name", ""). + BuildEventFuncRequest() + }, + ExpectPortalUpdate0ContainsInOrder: []string{"name must not be empty"}, + }, + } + + for _, c := range cases { + t.Run(c.Name, func(t *testing.T) { + multipartestutils.RunCase(t, c, pb) + }) + } +} diff --git a/docs/docsrc/examples/examples_presets/mux.go b/docs/docsrc/examples/examples_presets/mux.go index 2028727bb..4986e39fd 100644 --- a/docs/docsrc/examples/examples_presets/mux.go +++ b/docs/docsrc/examples/examples_presets/mux.go @@ -37,6 +37,7 @@ func SamplesHandler(mux examples.Muxer) { addExample(mux, db, PresetsConfirmDialog) addExample(mux, db, PresetsEditingCustomizationTabs) addExample(mux, db, PresetsEditingValidate) + addExample(mux, db, PresetsEditingSetter) addExample(mux, db, PresetsListingCustomizationSearcher) addExample(mux, db, PresetsDetailInlineEditDetails) addExample(mux, db, PresetsDetailInlineEditInspectTables) diff --git a/presets/field.go b/presets/field.go index 7abd5553d..df4108e43 100644 --- a/presets/field.go +++ b/presets/field.go @@ -500,8 +500,10 @@ func (b *FieldsBuilder) getFieldOrDefault(name string) (r *FieldBuilder) { } ft := b.defaults.fieldTypeByTypeOrCreate(fType) - r.ComponentFunc(ft.compFunc). - SetterFunc(ft.setterFunc) + r.ComponentFunc(ft.compFunc) + if r.setterFunc == nil { + r.SetterFunc(ft.setterFunc) + } } return }