| package types |
|
|
| import ( |
| "html/template" |
| "net/url" |
|
|
| "github.com/GoAdminGroup/go-admin/context" |
| "github.com/GoAdminGroup/go-admin/modules/language" |
| "github.com/GoAdminGroup/go-admin/modules/utils" |
| "github.com/GoAdminGroup/go-admin/plugins/admin/models" |
| ) |
|
|
| type Button interface { |
| Content(ctx *context.Context) (template.HTML, template.JS) |
| GetAction() Action |
| URL() string |
| METHOD() string |
| ID() string |
| Type() string |
| GetName() string |
| SetName(name string) |
| IsType(t string) bool |
| } |
|
|
| type BaseButton struct { |
| Id, Url, Method, Name, TypeName string |
| Title template.HTML |
| Action Action |
| } |
|
|
| func (b *BaseButton) Content() (template.HTML, template.JS) { return "", "" } |
| func (b *BaseButton) GetAction() Action { return b.Action } |
| func (b *BaseButton) ID() string { return b.Id } |
| func (b *BaseButton) URL() string { return b.Url } |
| func (b *BaseButton) Type() string { return b.TypeName } |
| func (b *BaseButton) IsType(t string) bool { return b.TypeName == t } |
| func (b *BaseButton) METHOD() string { return b.Method } |
| func (b *BaseButton) GetName() string { return b.Name } |
| func (b *BaseButton) SetName(name string) { b.Name = name } |
|
|
| type DefaultButton struct { |
| *BaseButton |
| Color template.HTML |
| TextColor template.HTML |
| Icon string |
| Direction template.HTML |
| Group bool |
| } |
|
|
| func GetDefaultButton(title template.HTML, icon string, action Action, colors ...template.HTML) *DefaultButton { |
| return defaultButton(title, "right", icon, action, false, colors...) |
| } |
|
|
| func GetDefaultButtonGroup(title template.HTML, icon string, action Action, colors ...template.HTML) *DefaultButton { |
| return defaultButton(title, "right", icon, action, true, colors...) |
| } |
|
|
| func defaultButton(title, direction template.HTML, icon string, action Action, group bool, colors ...template.HTML) *DefaultButton { |
| id := btnUUID() |
| action.SetBtnId("." + id) |
|
|
| var color, textColor template.HTML |
| if len(colors) > 0 { |
| color = colors[0] |
| } |
| if len(colors) > 1 { |
| textColor = colors[1] |
| } |
| node := action.GetCallbacks() |
| return &DefaultButton{ |
| BaseButton: &BaseButton{ |
| Id: id, |
| Title: title, |
| Action: action, |
| Url: node.Path, |
| Method: node.Method, |
| }, |
| Group: group, |
| Color: color, |
| TextColor: textColor, |
| Icon: icon, |
| Direction: direction, |
| } |
| } |
|
|
| func GetColumnButton(title template.HTML, icon string, action Action, colors ...template.HTML) *DefaultButton { |
| return defaultButton(title, "", icon, action, true, colors...) |
| } |
|
|
| func (b *DefaultButton) Content(ctx *context.Context) (template.HTML, template.JS) { |
|
|
| color := template.HTML("") |
| if b.Color != template.HTML("") { |
| color = template.HTML(`background-color:`) + b.Color + template.HTML(`;`) |
| } |
| textColor := template.HTML("") |
| if b.TextColor != template.HTML("") { |
| textColor = template.HTML(`color:`) + b.TextColor + template.HTML(`;`) |
| } |
|
|
| style := template.HTML("") |
| addColor := color + textColor |
|
|
| if addColor != template.HTML("") { |
| style = template.HTML(`style="`) + addColor + template.HTML(`"`) |
| } |
|
|
| h := template.HTML("") |
| if b.Group { |
| h += `<div class="btn-group pull-` + b.Direction + `" style="margin-right: 10px">` |
| } |
|
|
| h += `<a ` + style + ` class="` + template.HTML(b.Id) + ` btn btn-sm btn-default ` + b.Action.BtnClass() + `" ` + b.Action.BtnAttribute() + `> |
| <i class="fa ` + template.HTML(b.Icon) + `"></i> ` + b.Title + ` |
| </a>` |
| if b.Group { |
| h += `</div>` |
| } |
| return h + b.Action.ExtContent(ctx), b.Action.Js() |
| } |
|
|
| type ActionButton struct { |
| *BaseButton |
| } |
|
|
| func GetActionButton(title template.HTML, action Action, ids ...string) *ActionButton { |
|
|
| id := "" |
| if len(ids) > 0 { |
| id = ids[0] |
| } else { |
| id = "action-info-btn-" + utils.Uuid(10) |
| } |
|
|
| action.SetBtnId("." + id) |
| node := action.GetCallbacks() |
|
|
| return &ActionButton{ |
| BaseButton: &BaseButton{ |
| Id: id, |
| Title: title, |
| Action: action, |
| Url: node.Path, |
| Method: node.Method, |
| }, |
| } |
| } |
|
|
| func (b *ActionButton) Content(ctx *context.Context) (template.HTML, template.JS) { |
| h := template.HTML(`<li style="cursor: pointer;"><a data-id="{{.Id}}" class="`+template.HTML(b.Id)+` `+ |
| b.Action.BtnClass()+`" `+b.Action.BtnAttribute()+`>`+b.Title+`</a></li>`) + b.Action.ExtContent(ctx) |
| return h, b.Action.Js() |
| } |
|
|
| type ActionIconButton struct { |
| Icon template.HTML |
| *BaseButton |
| } |
|
|
| func GetActionIconButton(icon string, action Action, ids ...string) *ActionIconButton { |
|
|
| id := "" |
| if len(ids) > 0 { |
| id = ids[0] |
| } else { |
| id = "action-info-btn-" + utils.Uuid(10) |
| } |
|
|
| action.SetBtnId("." + id) |
| node := action.GetCallbacks() |
|
|
| return &ActionIconButton{ |
| Icon: template.HTML(icon), |
| BaseButton: &BaseButton{ |
| Id: id, |
| Action: action, |
| Url: node.Path, |
| Method: node.Method, |
| }, |
| } |
| } |
|
|
| func (b *ActionIconButton) Content(ctx *context.Context) (template.HTML, template.JS) { |
| h := template.HTML(`<a data-id="{{.Id}}" class="`+template.HTML(b.Id)+` `+ |
| b.Action.BtnClass()+`" `+b.Action.BtnAttribute()+`><i class="fa `+b.Icon+`" style="font-size: 16px;"></i></a>`) + b.Action.ExtContent(ctx) |
| return h, b.Action.Js() |
| } |
|
|
| type Buttons []Button |
|
|
| func (b Buttons) Add(btn Button) Buttons { |
| return append(b, btn) |
| } |
|
|
| func (b Buttons) Content(ctx *context.Context) (template.HTML, template.JS) { |
| h := template.HTML("") |
| j := template.JS("") |
|
|
| for _, btn := range b { |
| hh, jj := btn.Content(ctx) |
| h += hh |
| j += jj |
| } |
| return h, j |
| } |
|
|
| func (b Buttons) Copy() Buttons { |
| var c = make(Buttons, len(b)) |
| copy(c, b) |
| return c |
| } |
|
|
| func (b Buttons) FooterContent(ctx *context.Context) template.HTML { |
| footer := template.HTML("") |
|
|
| for _, btn := range b { |
| footer += btn.GetAction().FooterContent(ctx) |
| } |
| return footer |
| } |
|
|
| func (b Buttons) CheckPermission(user models.UserModel) Buttons { |
| btns := make(Buttons, 0) |
| for _, btn := range b { |
| if btn.IsType(ButtonTypeNavDropDown) { |
| items := make([]Button, 0) |
| for _, navItem := range btn.(*NavDropDownButton).Items { |
| if user.CheckPermissionByUrlMethod(btn.URL(), btn.METHOD(), url.Values{}) { |
| items = append(items, navItem) |
| } |
| } |
| if len(items) > 0 { |
| btns = append(btns, btn) |
| } |
| } else if user.CheckPermissionByUrlMethod(btn.URL(), btn.METHOD(), url.Values{}) { |
| btns = append(btns, btn) |
| } |
| } |
| return btns |
| } |
|
|
| func (b Buttons) CheckPermissionWhenURLAndMethodNotEmpty(user models.UserModel) Buttons { |
| btns := make(Buttons, 0) |
| for _, b := range b { |
| if b.URL() == "" || b.METHOD() == "" || user.CheckPermissionByUrlMethod(b.URL(), b.METHOD(), url.Values{}) { |
| btns = append(btns, b) |
| } |
| } |
| return btns |
| } |
|
|
| func (b Buttons) AddNavButton(ico, name string, action Action) Buttons { |
| if !b.CheckExist(name) { |
| return append(b, GetNavButton(language.GetFromHtml(template.HTML(name)), ico, action, name)) |
| } |
| return b |
| } |
|
|
| func (b Buttons) RemoveButtonByName(name string) Buttons { |
| if name == "" { |
| return b |
| } |
|
|
| for i := 0; i < len(b); i++ { |
| if b[i].GetName() == name { |
| b = append(b[:i], b[i+1:]...) |
| } |
| } |
| return b |
| } |
|
|
| func (b Buttons) CheckExist(name string) bool { |
| if name == "" { |
| return false |
| } |
| for i := 0; i < len(b); i++ { |
| if b[i].GetName() == name { |
| return true |
| } |
| } |
| return false |
| } |
|
|
| func (b Buttons) Callbacks() []context.Node { |
| cbs := make([]context.Node, 0) |
| for _, btn := range b { |
| cbs = append(cbs, btn.GetAction().GetCallbacks()) |
| } |
| return cbs |
| } |
|
|
| const ( |
| NavBtnSiteName = "site setting" |
| NavBtnInfoName = "site info" |
| NavBtnToolName = "code generate tool" |
| NavBtnPlugName = "plugins" |
| ) |
|
|
| func (b Buttons) RemoveSiteNavButton() Buttons { |
| return b.RemoveButtonByName(NavBtnSiteName) |
| } |
|
|
| func (b Buttons) RemoveInfoNavButton() Buttons { |
| return b.RemoveButtonByName(NavBtnInfoName) |
| } |
|
|
| func (b Buttons) RemoveToolNavButton() Buttons { |
| return b.RemoveButtonByName(NavBtnToolName) |
| } |
|
|
| func (b Buttons) RemovePlugNavButton() Buttons { |
| return b.RemoveButtonByName(NavBtnPlugName) |
| } |
|
|
| type NavButton struct { |
| *BaseButton |
| Icon string |
| } |
|
|
| func GetNavButton(title template.HTML, icon string, action Action, names ...string) *NavButton { |
|
|
| id := btnUUID() |
| action.SetBtnId("." + id) |
| node := action.GetCallbacks() |
| name := "" |
|
|
| if len(names) > 0 { |
| name = names[0] |
| } |
|
|
| return &NavButton{ |
| BaseButton: &BaseButton{ |
| Id: id, |
| Title: title, |
| Action: action, |
| Url: node.Path, |
| Method: node.Method, |
| Name: name, |
| }, |
| Icon: icon, |
| } |
| } |
|
|
| func (n *NavButton) Content(ctx *context.Context) (template.HTML, template.JS) { |
|
|
| ico := template.HTML("") |
| title := template.HTML("") |
|
|
| if n.Icon != "" { |
| ico = template.HTML(`<i class="fa ` + n.Icon + `"></i>`) |
| } |
|
|
| if n.Title != "" { |
| title = `<span>` + n.Title + `</span>` |
| } |
|
|
| h := template.HTML(`<li> |
| <a class="`+template.HTML(n.Id)+` `+n.Action.BtnClass()+` dropdown-item" `+n.Action.BtnAttribute()+`> |
| `+ico+` |
| `+title+` |
| </a> |
| </li>`) + n.Action.ExtContent(ctx) |
| return h, n.Action.Js() |
| } |
|
|
| type NavDropDownButton struct { |
| *BaseButton |
| Icon string |
| Items []*NavDropDownItemButton |
| } |
|
|
| type NavDropDownItemButton struct { |
| *BaseButton |
| } |
|
|
| func GetDropDownButton(title template.HTML, icon string, items []*NavDropDownItemButton, names ...string) *NavDropDownButton { |
| id := btnUUID() |
| name := "" |
|
|
| if len(names) > 0 { |
| name = names[0] |
| } |
|
|
| return &NavDropDownButton{ |
| BaseButton: &BaseButton{ |
| Id: id, |
| Title: title, |
| Name: name, |
| TypeName: ButtonTypeNavDropDown, |
| Action: new(NilAction), |
| }, |
| Items: items, |
| Icon: icon, |
| } |
| } |
|
|
| func (n *NavDropDownButton) SetItems(items []*NavDropDownItemButton) { |
| n.Items = items |
| } |
|
|
| func (n *NavDropDownButton) AddItem(item *NavDropDownItemButton) { |
| n.Items = append(n.Items, item) |
| } |
|
|
| func (n *NavDropDownButton) Content(ctx *context.Context) (template.HTML, template.JS) { |
|
|
| ico := template.HTML("") |
| title := template.HTML("") |
|
|
| if n.Icon != "" { |
| ico = template.HTML(`<i class="fa ` + n.Icon + `"></i>`) |
| } |
|
|
| if n.Title != "" { |
| title = `<span>` + n.Title + `</span>` |
| } |
|
|
| content := template.HTML("") |
| js := template.JS("") |
|
|
| for _, item := range n.Items { |
| c, j := item.Content(ctx) |
| content += c |
| js += j |
| } |
|
|
| did := utils.Uuid(10) |
|
|
| h := template.HTML(`<li class="dropdown" id="` + template.HTML(did) + `"> |
| <a class="` + template.HTML(n.Id) + ` dropdown-toggle" data-toggle="dropdown" style="cursor:pointer;"> |
| ` + ico + ` |
| ` + title + ` |
| </a> |
| <ul class="dropdown-menu" aria-labelledby="` + template.HTML(did) + `"> |
| ` + content + ` |
| </ul> |
| </li>`) |
|
|
| return h, js |
| } |
|
|
| const ( |
| ButtonTypeNavDropDownItem = "navdropdownitem" |
| ButtonTypeNavDropDown = "navdropdown" |
| ) |
|
|
| func GetDropDownItemButton(title template.HTML, action Action, names ...string) *NavDropDownItemButton { |
| id := btnUUID() |
| action.SetBtnId("." + id) |
| node := action.GetCallbacks() |
| name := "" |
|
|
| if len(names) > 0 { |
| name = names[0] |
| } |
|
|
| return &NavDropDownItemButton{ |
| BaseButton: &BaseButton{ |
| Id: id, |
| Title: title, |
| Action: action, |
| Url: node.Path, |
| Method: node.Method, |
| Name: name, |
| TypeName: ButtonTypeNavDropDownItem, |
| }, |
| } |
| } |
|
|
| func (n *NavDropDownItemButton) Content(ctx *context.Context) (template.HTML, template.JS) { |
|
|
| title := template.HTML("") |
|
|
| if n.Title != "" { |
| title = `<span>` + n.Title + `</span>` |
| } |
|
|
| h := template.HTML(`<li><a class="dropdown-item `+template.HTML(n.Id)+` `+ |
| n.Action.BtnClass()+`" `+n.Action.BtnAttribute()+`> |
| `+title+` |
| </a></li>`) + n.Action.ExtContent(ctx) |
| return h, n.Action.Js() |
| } |
|
|