Search & Scopes & Filters
Search
You could configure searchable attributes for a resource with SearchAttrs
, if SearchAttrs
is not set, will use resource's IndexAttrs
to search
// Allow search products with its Name, Code and its category, brand's Name
product.SearchAttrs("Name", "Code", "Category.Name", "Brand.Name")
After SearchAttrs is set, QOR Admin will generate a SearchHandler
func for current resource based on your configuration, e.g:
product.SearchHandler
You can overwrite it to customize resource's search, like preload some relations to kill N+1
issue
oldSearchHandler := product.SearchHandler
product.SearchHandler = func(keyword string, context *qor.Context) *gorm.DB {
context.SetDB(context.GetDB().Preload("Variations.Color").Preload("Variations.Size").Preload("Variations.Material"))
return oldSearchHandler(keyword, context)
}
Add Resource to Admin Search Center
QOR Admin provides a search center, you could register searchable resources with AddSearchResource
, with the search center, you could search multiple resources in one request
Admin.AddSearchResource(product, user, order)
Scopes
You can define scopes to filter data with given conditions, for example:
// Only show active users
user.Scope(&admin.Scope{Name: "Active", Handler: func(db *gorm.DB, context *qor.Context) *gorm.DB {
return db.Where("active = ?", true)
}})
Screenshot
Group Scopes
To put similar scopes into one group, set the Group
name for it as below:
order.Scope(&admin.Scope{Name: "Paid", Group: "State", Handler: func(db *gorm.DB, context *qor.Context) *gorm.DB {
return db.Where("state = ?", "paid")
}})
order.Scope(&admin.Scope{Name: "Shipped", Group: "State", Handler: func(db *gorm.DB, context *qor.Context) *gorm.DB {
return db.Where("state = ?", "shipped")
}})
Screenshot:
Default Scopes
Default Scope will be applied to all requests
order.Scope(&admin.Scope{
Name: "Default Scope",
Default: true,
Handler: func(db *gorm.DB, context *qor.Context) *gorm.DB {
return db.Where("state = ?", "paid")
},
})
Visible Scopes based on a condition
Make scope visible based on Visible
return true
order.Scope(&admin.Scope{Name: "Paid", Group: "State",
Visible: func(context *admin.Context) bool {
return context.CurrentUser.IsAdmin
},
Handler: func(db *gorm.DB, context *qor.Context) *gorm.DB {
return db.Where("state = ?", "paid")
},
})
Filters
Make any Resource filter-able, within QOR Admin, with given setting(s).
The example below shows how to filter Users, in a hypothetical project, by gender (either 'Male', 'Female', or 'Unknown').
// Filter users by gender
user.Filter(&admin.Filter{
Name: "Gender",
Config: &admin.SelectOneConfig{
Collection: []string{"Male", "Female", "Unknown"},
},
})
// Filter products by collection
product.Filter(&admin.Filter{
Name: "Collections",
Config: &admin.SelectOneConfig{RemoteDataResource: collection},
})
Screenshot:
Visible Filters based on a condition
Make Filter visible based on Visible
return true
user.Filter(&admin.Filter{
Name: "Gender",
Visible: func(context *admin.Context) bool {
return context.CurrentUser.IsAdmin
},
Config: &admin.SelectOneConfig{
Collection: []string{"Male", "Female", "Unknown"},
},
})