123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- package example_basics
- import (
- "time"
- "github.com/qor5/admin/presets"
- "github.com/qor5/admin/presets/gorm2op"
- "github.com/qor5/ui/vuetify"
- "github.com/qor5/web"
- h "github.com/theplant/htmlgo"
- "gorm.io/driver/sqlite"
- "gorm.io/gorm"
- "gorm.io/gorm/logger"
- )
- var DB *gorm.DB
- func init() {
- DB = setupDB()
- }
- func setupDB() (db *gorm.DB) {
- var err error
- db, err = gorm.Open(sqlite.Open("/tmp/my.db"), &gorm.Config{})
- if err != nil {
- panic(err)
- }
- db.Logger.LogMode(logger.Info)
- err = db.AutoMigrate(
- &Post{},
- &Category{},
- )
- if err != nil {
- panic(err)
- }
- return
- }
- const ListingSamplePath = "/samples/listing"
- // @snippet_begin(PresetsListingSample)
- type Post struct {
- ID uint
- Title string
- Body string
- UpdatedAt time.Time
- CreatedAt time.Time
- Disabled bool
- Status string
- CategoryID uint
- }
- type Category struct {
- ID uint
- Name string
- UpdatedAt time.Time
- CreatedAt time.Time
- }
- func ListingSample(b *presets.Builder) {
- db := DB
- // Setup the project name, ORM and Homepage
- b.URIPrefix(ListingSamplePath).DataOperator(gorm2op.DataOperator(db))
- // Register Post into the builder
- // Use m to customize the model, Or config more models here.
- postModelBuilder := b.Model(&Post{})
- postModelBuilder.Listing("ID", "Title", "Body", "CategoryID", "VirtualField")
- postModelBuilder.Listing().Searcher = func(model interface{}, params *presets.SearchParams, ctx *web.EventContext) (r interface{}, totalCount int, err error) {
- qdb := db.Where("disabled != true")
- return gorm2op.DataOperator(qdb).Search(model, params, ctx)
- }
- rmn := postModelBuilder.Listing().RowMenu()
- rmn.RowMenuItem("Show").ComponentFunc(func(obj interface{}, id string, ctx *web.EventContext) h.HTMLComponent {
- return h.Text("Fake Show")
- })
- postModelBuilder.Listing().ActionsAsMenu(true)
- postModelBuilder.Editing().Field("CategoryID").ComponentFunc(func(obj interface{}, field *presets.FieldContext, ctx *web.EventContext) h.HTMLComponent {
- categories := []Category{}
- if err := db.Find(&categories).Error; err != nil {
- // ignore err for now
- }
- return vuetify.VAutocomplete().Chips(true).FieldName(field.Name).Label(field.Label).Value(field.Value(obj)).Items(categories).ItemText("Name").ItemValue("ID")
- })
- postModelBuilder.Listing().Field("CategoryID").Label("Category").ComponentFunc(func(obj interface{}, field *presets.FieldContext, ctx *web.EventContext) h.HTMLComponent {
- c := Category{}
- cid, _ := field.Value(obj).(uint)
- if err := db.Where("id = ?", cid).Find(&c).Error; err != nil {
- // ignore err in the example
- }
- return h.Td(h.Text(c.Name))
- })
- postModelBuilder.Listing().Field("VirtualField").ComponentFunc(func(obj interface{}, field *presets.FieldContext, ctx *web.EventContext) h.HTMLComponent {
- return h.Td(h.Text("virtual field"))
- })
- b.Model(&Category{})
- // Use m to customize the model, Or config more models here.
- return
- }
- // @snippet_end
|