gosora/common/menu_store.go
Azareal 185f00e019 You can now reorder menu items by dragging them around in the menu item manager.
You can now create menu items.
You can now delete menu items.

Renamed ID to MenuID on PanelMenuPage struct.
Bumped the copyright year in a place in advance.
The footer is no longer hidden in the Control Panel in Tempra Simple.
Fixed the notifications URL, although that page still isn't implemented yet.
Fixed config_default.noparse so that Travis won't error over that.
Refactored some user queries.
2018-05-13 16:56:59 +10:00

77 lines
2.0 KiB
Go

package common
import (
"database/sql"
"strconv"
"sync/atomic"
"../query_gen/lib"
)
var Menus *DefaultMenuStore
type DefaultMenuStore struct {
menus map[int]*atomic.Value
itemStore *DefaultMenuItemStore
}
func NewDefaultMenuStore() *DefaultMenuStore {
return &DefaultMenuStore{
make(map[int]*atomic.Value),
NewDefaultMenuItemStore(),
}
}
// TODO: Add actual support for multiple menus
func (store *DefaultMenuStore) GetAllMap() (out map[int]*MenuListHolder) {
out = make(map[int]*MenuListHolder)
for mid, atom := range store.menus {
out[mid] = atom.Load().(*MenuListHolder)
}
return out
}
func (store *DefaultMenuStore) Get(mid int) (*MenuListHolder, error) {
aStore, ok := store.menus[mid]
if ok {
return aStore.Load().(*MenuListHolder), nil
}
return nil, ErrNoRows
}
func (store *DefaultMenuStore) Items(mid int) (mlist MenuItemList, err error) {
acc := qgen.Builder.Accumulator()
err = acc.Select("menu_items").Columns("miid, name, htmlID, cssClass, position, path, aria, tooltip, order, tmplName, guestOnly, memberOnly, staffOnly, adminOnly").Where("mid = " + strconv.Itoa(mid)).Orderby("order ASC").Each(func(rows *sql.Rows) error {
var mitem = MenuItem{MenuID: mid}
err := rows.Scan(&mitem.ID, &mitem.Name, &mitem.HTMLID, &mitem.CSSClass, &mitem.Position, &mitem.Path, &mitem.Aria, &mitem.Tooltip, &mitem.Order, &mitem.TmplName, &mitem.GuestOnly, &mitem.MemberOnly, &mitem.SuperModOnly, &mitem.AdminOnly)
if err != nil {
return err
}
store.itemStore.Add(mitem)
mlist = append(mlist, mitem)
return nil
})
return mlist, err
}
func (store *DefaultMenuStore) Load(mid int) error {
mlist, err := store.Items(mid)
if err != nil {
return err
}
hold := &MenuListHolder{mid, mlist, make(map[int]menuTmpl)}
err = hold.Preparse()
if err != nil {
return err
}
var aStore = &atomic.Value{}
aStore.Store(hold)
store.menus[mid] = aStore
return nil
}
func (store *DefaultMenuStore) ItemStore() *DefaultMenuItemStore {
return store.itemStore
}