47 lines
1.3 KiB
Go
47 lines
1.3 KiB
Go
package custom
|
|
|
|
import (
|
|
"html/template"
|
|
"net/http"
|
|
|
|
"github.com/FAU-CDI/wisski-distillery/internal/dis/component"
|
|
"github.com/FAU-CDI/wisski-distillery/pkg/mux"
|
|
"golang.org/x/exp/slices"
|
|
)
|
|
|
|
// getMenuItems gets a fresh copy of the cached slice of menu items
|
|
func (custom *Custom) Menu(r *http.Request) []component.MenuItem {
|
|
return custom.menu.Get(func() []component.MenuItem {
|
|
items := make([]component.MenuItem, 0, len(custom.Dependencies.Routeables))
|
|
for _, route := range custom.Dependencies.Routeables {
|
|
routes := route.Routes()
|
|
if routes.MenuTitle == "" {
|
|
continue
|
|
}
|
|
items = append(items, component.MenuItem{
|
|
Title: routes.MenuTitle,
|
|
Priority: routes.MenuPriority,
|
|
Path: template.URL(routes.Prefix),
|
|
})
|
|
}
|
|
slices.SortFunc(items, component.MenuItemSort)
|
|
return items
|
|
})
|
|
}
|
|
|
|
func (custom *Custom) BuildMenu(r *http.Request) []component.MenuItem {
|
|
// NOTE(twiesing): Don't name this method "Menu", as it will cause
|
|
// a stack overflow.
|
|
path := mux.NormalizePath(r.URL.Path)
|
|
|
|
// get the static menu items, and then return all the regular ones
|
|
var items []component.MenuItem
|
|
for _, m := range custom.Dependencies.Menuable {
|
|
items = append(items, m.Menu(r)...)
|
|
}
|
|
for i, item := range items {
|
|
items[i].Active = string(item.Path) == path
|
|
}
|
|
slices.SortFunc(items, component.MenuItemSort)
|
|
return items
|
|
}
|