forked from qor/qor
-
Notifications
You must be signed in to change notification settings - Fork 0
/
menu.go
87 lines (71 loc) · 1.67 KB
/
menu.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
package admin
import "path"
type Menu struct {
Name string
Link string
Ancestors []string
subMenus []*Menu
rawPath string
}
func (admin Admin) GetMenus() []*Menu {
return admin.menus
}
func (menu *Menu) GetSubMenus() []*Menu {
return menu.subMenus
}
func (admin *Admin) AddMenu(menu *Menu) {
admin.menus = appendMenu(admin.menus, menu.Ancestors, menu)
}
func (admin Admin) GetMenu(name string) *Menu {
return getMenu(admin.menus, name)
}
func getMenu(menus []*Menu, name string) *Menu {
for _, m := range menus {
if m.Name == name {
return m
}
if len(m.subMenus) > 0 {
if mc := getMenu(m.subMenus, name); mc != nil {
return mc
}
}
}
return nil
}
// Generate menu links by current route. e.g "/products" to "/admin/products"
func (admin *Admin) generateMenuLinks() {
prefixMenuLinks(admin.menus, admin.router.Prefix)
}
func prefixMenuLinks(menus []*Menu, prefix string) {
for _, m := range menus {
if m.rawPath != "" {
m.Link = path.Join(prefix, m.rawPath)
}
if len(m.subMenus) > 0 {
prefixMenuLinks(m.subMenus, prefix)
}
}
}
func newMenu(menus []string, menu *Menu) *Menu {
menuCount := len(menus)
for index, _ := range menus {
menu = &Menu{Name: menus[menuCount-index-1], subMenus: []*Menu{menu}}
}
return menu
}
func appendMenu(menus []*Menu, ancestors []string, menu *Menu) []*Menu {
if len(ancestors) > 0 {
for _, m := range menus {
if m.Name != ancestors[0] {
continue
}
if len(ancestors) > 1 {
m.subMenus = appendMenu(m.subMenus, ancestors[1:], menu)
} else {
m.subMenus = append(m.subMenus, newMenu(nil, menu))
}
return menus
}
}
return append(menus, newMenu(ancestors, menu))
}