/
activity.go
94 lines (82 loc) · 3.51 KB
/
activity.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package activity
import (
"fmt"
"strings"
"github.com/jinzhu/gorm"
"github.com/qor/admin"
"github.com/qor/audited"
"github.com/qor/media/asset_manager"
"github.com/qor/qor"
"github.com/qor/qor/resource"
"github.com/qor/qor/utils"
"github.com/qor/validations"
)
// QorActivity default model used to save resource's activities
type QorActivity struct {
gorm.Model
Action string
Content string `sql:"size:5000"`
Note string `sql:"size:2000"`
Type string
ResourceType string
ResourceID string
CreatorName string
audited.AuditedModel
}
// Register register activity feature for an qor resource
func Register(res *admin.Resource) {
var (
qorAdmin = res.GetAdmin()
activityResource = qorAdmin.GetResource("QorActivity")
)
if activityResource == nil {
// Auto run migration before add resource
res.GetAdmin().DB.AutoMigrate(&QorActivity{})
activityResource = qorAdmin.AddResource(&QorActivity{}, &admin.Config{Invisible: true})
activityResource.Meta(&admin.Meta{Name: "Action", Type: "hidden", Valuer: func(value interface{}, ctx *qor.Context) interface{} {
act := value.(*QorActivity)
if act.Action == "" {
act.Action = "comment on"
}
return activityResource.GetAdmin().T(ctx, "activity."+act.Action, act.Action)
}})
activityResource.Meta(&admin.Meta{Name: "UpdatedAt", Type: "hidden", Valuer: func(value interface{}, ctx *qor.Context) interface{} {
return utils.FormatTime(value.(*QorActivity).UpdatedAt, "Jan 2 15:04", ctx)
}})
activityResource.Meta(&admin.Meta{Name: "URL", Valuer: func(value interface{}, ctx *qor.Context) interface{} {
return fmt.Sprintf("/admin/%v/%v/!%v/%v/edit", res.ToParam(), res.GetPrimaryValue(ctx.Request), activityResource.ToParam(), value.(*QorActivity).ID)
}})
assetManager := qorAdmin.GetResource("AssetManager")
if assetManager == nil {
assetManager = qorAdmin.AddResource(&asset_manager.AssetManager{}, &admin.Config{Invisible: true})
}
activityResource.Meta(&admin.Meta{Name: "Content", Type: "rich_editor", Resource: assetManager})
activityResource.Meta(&admin.Meta{Name: "Note", Type: "string", Resource: assetManager})
activityResource.EditAttrs("Action", "Content", "Note")
activityResource.ShowAttrs("ID", "Action", "Content", "Note", "URL", "UpdatedAt", "CreatorName")
activityResource.AddValidator(&resource.Validator{
Name: "activity-content-validator",
Handler: func(record interface{}, metaValues *resource.MetaValues, context *qor.Context) error {
if meta := metaValues.Get("Content"); meta != nil {
if name := utils.ToString(meta.Value); strings.TrimSpace(name) == "" {
return validations.NewError(record, "Content", "Content can't be blank")
}
}
return nil
},
})
}
res.GetAdmin().RegisterViewPath("github.com/qor/activity/views")
res.UseTheme("activity")
qorAdmin.RegisterFuncMap("activity_resource", func() *admin.Resource {
return qorAdmin.GetResource("QorActivity")
})
qorAdmin.RegisterFuncMap("get_activities_count", func(context *admin.Context) int {
return GetActivitiesCount(context, context.Result)
})
router := res.GetAdmin().GetRouter()
ctrl := controller{ActivityResource: activityResource}
router.Get(fmt.Sprintf("/%v/%v/!qor_activities", res.ToParam(), res.ParamIDName()), ctrl.GetActivity)
router.Post(fmt.Sprintf("/%v/%v/!qor_activities", res.ToParam(), res.ParamIDName()), ctrl.CreateActivity)
router.Post(fmt.Sprintf("/%v/%v/!qor_activities/%v/edit", res.ToParam(), res.ParamIDName(), activityResource.ParamIDName()), ctrl.UpdateActivity)
}