diff --git a/docs/docsrc/examples/examples_presets/listing.go b/docs/docsrc/examples/examples_presets/listing.go index d74a7b901..c2c852cbf 100644 --- a/docs/docsrc/examples/examples_presets/listing.go +++ b/docs/docsrc/examples/examples_presets/listing.go @@ -79,6 +79,23 @@ func PresetsKeywordSearchOff(b *presets.Builder, db *gorm.DB) ( // @snippet_begin(PresetsListingCustomizationFieldsSample) +func PresetsRowMenuAction(b *presets.Builder, db *gorm.DB) ( + mb *presets.ModelBuilder, + cl *presets.ListingBuilder, + ce *presets.EditingBuilder, + dp *presets.DetailingBuilder, +) { + mb, cl, ce, dp = PresetsHelloWorld(b, db) + cl.KeywordSearchOff(true) + rmb := cl.RowMenu() + + rmb.RowMenuItem("with-icon").Icon("mdi-close") + rmb.RowMenuItem("Delete").ComponentFunc(func(obj interface{}, id string, ctx *web.EventContext) h.HTMLComponent { + return nil + }) + return +} + type Company struct { ID int Name string diff --git a/docs/docsrc/examples/examples_presets/listing_test.go b/docs/docsrc/examples/examples_presets/listing_test.go index 1e8fdcc47..16f269a1e 100644 --- a/docs/docsrc/examples/examples_presets/listing_test.go +++ b/docs/docsrc/examples/examples_presets/listing_test.go @@ -31,6 +31,30 @@ func TestPresetsListingKeywordSearchOff(t *testing.T) { } } +func TestPresetsRowMenuIcon(t *testing.T) { + + pb := presets.New().DataOperator(gorm2op.DataOperator(TestDB)) + PresetsRowMenuAction(pb, TestDB) + TestDB.AutoMigrate(&CreditCard{}) + cases := []multipartestutils.TestCase{ + { + Name: "row menu with no icon", + Debug: true, + ReqFunc: func() *http.Request { + detailData.TruncatePut(SqlDB) + return httptest.NewRequest("GET", "/customers?__execute_event__=__reload__", nil) + }, + ExpectPageBodyContainsInOrder: []string{`:icon='\"mdi-close\"'\u003e\u003c/v-icon\u003e\n\u003c/template\u003e\n\n\u003cv-list-item-title\u003ewith-icon\u003c/v-list-item-title\u003e`}, + }, + } + + for _, c := range cases { + t.Run(c.Name, func(t *testing.T) { + multipartestutils.RunCase(t, c, pb) + }) + } +} + func TestPresetsListingCustomizationFields(t *testing.T) { pb := presets.New().DataOperator(gorm2op.DataOperator(TestDB)) PresetsListingCustomizationFields(pb, TestDB) diff --git a/docs/docsrc/examples/examples_presets/mux.go b/docs/docsrc/examples/examples_presets/mux.go index de47762f7..fc0dab41c 100644 --- a/docs/docsrc/examples/examples_presets/mux.go +++ b/docs/docsrc/examples/examples_presets/mux.go @@ -13,6 +13,7 @@ func SamplesHandler(mux examples.Muxer) { db := docsexamples.ExampleDB() addExample(mux, db, PresetsHelloWorld) addExample(mux, db, PresetsKeywordSearchOff) + addExample(mux, db, PresetsRowMenuAction) addExample(mux, db, PresetsListingCustomizationFields) addExample(mux, db, PresetsListingCustomizationFilters) addExample(mux, db, PresetsListingCustomizationTabs) diff --git a/go.mod b/go.mod index a56cc89fc..07d9fb812 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/pquerna/otp v1.4.0 github.com/qor/oss v0.0.0-20240729105053-88484a799a79 github.com/qor5/web/v3 v3.0.7 - github.com/qor5/x/v3 v3.0.8 + github.com/qor5/x/v3 v3.0.9-0.20240830095515-24fddd1fdf8f github.com/samber/lo v1.47.0 github.com/shurcooL/sanitized_anchor_name v1.0.0 github.com/spf13/cast v1.6.0 diff --git a/go.sum b/go.sum index fd4125379..ec8d4ac91 100644 --- a/go.sum +++ b/go.sum @@ -321,6 +321,10 @@ github.com/qor5/web/v3 v3.0.7 h1:1+Ezbl+1m9oZ4S1kcFKybyi6at6qxoY7eJqjb3JETQQ= github.com/qor5/web/v3 v3.0.7/go.mod h1:32vdHHcZb2JimlcaclW9hLUyimdXjrllZDHTh3rl6d0= github.com/qor5/x/v3 v3.0.8 h1:orSn34zBSBlAvumWyvmPxjXb8blJ2qGKHZy+8x4Y0gQ= github.com/qor5/x/v3 v3.0.8/go.mod h1:a+cSXd5UjIOgzhhpvfDxDUdjmKLKeDLeoubcQ9dkxtE= +github.com/qor5/x/v3 v3.0.9-0.20240830065723-63a1ee683f35 h1:S0PNHelYvywRb1gnytDIeU6ICHcpXGK2CYTHSk1HiIY= +github.com/qor5/x/v3 v3.0.9-0.20240830065723-63a1ee683f35/go.mod h1:a+cSXd5UjIOgzhhpvfDxDUdjmKLKeDLeoubcQ9dkxtE= +github.com/qor5/x/v3 v3.0.9-0.20240830095515-24fddd1fdf8f h1:tUAw2vElX+1hHdrzIu+P3H9+BAGnDbXBqI3gPgGNznE= +github.com/qor5/x/v3 v3.0.9-0.20240830095515-24fddd1fdf8f/go.mod h1:a+cSXd5UjIOgzhhpvfDxDUdjmKLKeDLeoubcQ9dkxtE= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= diff --git a/presets/messages.go b/presets/messages.go index 434a2cacb..fae4b271e 100644 --- a/presets/messages.go +++ b/presets/messages.go @@ -160,7 +160,7 @@ var Messages_en_US = &Messages{ EditingObjectTitleTemplate: "Editing {modelName} {id}", ListingObjectTitleTemplate: "Listing {modelName}", DetailingObjectTitleTemplate: "{modelName} {id}", - FiltersClear: "Clear Filters", + FiltersClear: "Reset", FiltersAdd: "Add Filters", FilterApply: "Apply", FilterByTemplate: "Filter by {filter}", diff --git a/presets/row_menu.go b/presets/row_menu.go index a8a93420b..646893918 100644 --- a/presets/row_menu.go +++ b/presets/row_menu.go @@ -137,10 +137,7 @@ func (b *RowMenuItemBuilder) getComponentFunc(_ *web.EventContext) vx.RowMenuIte return nil } return VListItem( - web.Slot( - VIcon(b.icon), - ).Name("prepend"), - + h.If(b.icon != "", web.Slot(VIcon(b.icon)).Name("prepend")), VListItemTitle(h.Text(i18n.PT(ctx.R, ModelsI18nModuleKey, strcase.ToCamel(b.rmb.mb.label+" RowMenuItem"), b.name))), ).Attr("@click", web.Plaid(). EventFunc(b.eventID).