From 7f820224ecabda1e0aeeb738c5ad375eaa5fd0bd Mon Sep 17 00:00:00 2001 From: Tom Wiesing Date: Fri, 3 Feb 2023 15:46:53 +0100 Subject: [PATCH] Refactor: Menu --- internal/dis/component/auth/panel/panel.go | 16 +++++++++++-- internal/dis/component/auth/panel/password.go | 3 +-- internal/dis/component/auth/panel/ssh.go | 13 +++++----- internal/dis/component/auth/panel/totp.go | 9 ++++--- internal/dis/component/auth/panel/user.go | 24 ++++++------------- internal/dis/component/resolver/resolver.go | 6 ++++- internal/dis/component/server/admin/admin.go | 13 ++++++++++ .../dis/component/server/admin/components.go | 23 +++++++----------- internal/dis/component/server/admin/grants.go | 17 +++++-------- internal/dis/component/server/admin/index.go | 17 ++++++------- .../dis/component/server/admin/instance.go | 22 +++++++---------- internal/dis/component/server/admin/users.go | 13 +++++----- internal/dis/component/server/home/home.go | 4 ++++ internal/dis/component/server/home/public.go | 3 +-- internal/dis/component/server/legal/legal.go | 6 ++++- internal/dis/component/server/news/news.go | 6 ++++- 16 files changed, 103 insertions(+), 92 deletions(-) diff --git a/internal/dis/component/auth/panel/panel.go b/internal/dis/component/auth/panel/panel.go index 2bda260..2e2e9c2 100644 --- a/internal/dis/component/auth/panel/panel.go +++ b/internal/dis/component/auth/panel/panel.go @@ -53,6 +53,17 @@ func (panel *UserPanel) Menu(r *http.Request) []component.MenuItem { } } +var ( + menuUser = component.MenuItem{Title: "User", Path: "/user/"} + menuChangePassword = component.MenuItem{Title: "Change Password", Path: "/user/password/"} + menuSSH = component.MenuItem{Title: "SSH Keys", Path: "/user/ssh/"} + menuSSHAdd = component.MenuItem{Title: "Add New Key", Path: "/user/ssh/add/"} + + menuTOTPAction = component.DummyMenuItem() + menuTOTPDisable = component.MenuItem{Title: "Disable Passcode (TOTP)", Path: "/user/totp/disable/"} + menuTOTPEnable = component.MenuItem{Title: "Enable Passcode (TOTP)", Path: "/user/totp/enable/"} +) + func (panel *UserPanel) HandleRoute(ctx context.Context, route string) (http.Handler, error) { router := httprouter.New() @@ -114,9 +125,10 @@ type userFormContext struct { func (panel *UserPanel) UserFormContext(tpl *templating.Template[userFormContext], last component.MenuItem, funcs ...templating.FlagFunc) func(ctx httpx.FormContext, r *http.Request) any { funcs = append(funcs, func(flags templating.Flags, r *http.Request) templating.Flags { - flags.Crumbs = append(flags.Crumbs, component.MenuItem{}) + // append the last menu item, and prepend the menuUser one! + flags.Crumbs = append(flags.Crumbs, last, last) copy(flags.Crumbs[1:], flags.Crumbs) - flags.Crumbs[0] = component.MenuItem{Title: "User", Path: "/user/"} + flags.Crumbs[0] = menuUser return flags }) diff --git a/internal/dis/component/auth/panel/password.go b/internal/dis/component/auth/panel/password.go index 6723d25..1ae39f2 100644 --- a/internal/dis/component/auth/panel/password.go +++ b/internal/dis/component/auth/panel/password.go @@ -7,7 +7,6 @@ import ( _ "embed" - "github.com/FAU-CDI/wisski-distillery/internal/dis/component" "github.com/FAU-CDI/wisski-distillery/internal/dis/component/server/assets" "github.com/FAU-CDI/wisski-distillery/internal/dis/component/server/templating" "github.com/FAU-CDI/wisski-distillery/pkg/httpx" @@ -45,7 +44,7 @@ func (panel *UserPanel) routePassword(ctx context.Context) http.Handler { FieldTemplate: field.PureCSSFieldTemplate, RenderTemplate: tpl.Template(), - RenderTemplateContext: panel.UserFormContext(tpl, component.MenuItem{Title: "Change Password", Path: "/user/password/"}), + RenderTemplateContext: panel.UserFormContext(tpl, menuChangePassword), Validate: func(r *http.Request, values map[string]string) (struct{}, error) { old, passcode, new, new2 := values["old"], values["otp"], values["new"], values["new2"] diff --git a/internal/dis/component/auth/panel/ssh.go b/internal/dis/component/auth/panel/ssh.go index 55bbd33..7d95d6b 100644 --- a/internal/dis/component/auth/panel/ssh.go +++ b/internal/dis/component/auth/panel/ssh.go @@ -5,7 +5,6 @@ import ( "errors" "net/http" - "github.com/FAU-CDI/wisski-distillery/internal/dis/component" "github.com/FAU-CDI/wisski-distillery/internal/dis/component/auth" "github.com/FAU-CDI/wisski-distillery/internal/dis/component/server/assets" "github.com/FAU-CDI/wisski-distillery/internal/dis/component/server/templating" @@ -45,11 +44,11 @@ func (panel *UserPanel) sshRoute(ctx context.Context) http.Handler { tpl := sshTemplate.Prepare( panel.Dependencies.Templating, templating.Crumbs( - component.MenuItem{Title: "User", Path: "/user/"}, - component.MenuItem{Title: "SSH Keys", Path: "/user/ssh/"}, + menuUser, + menuSSH, ), templating.Actions( - component.MenuItem{Title: "Add New Key", Path: "/user/ssh/add/"}, + menuSSHAdd, ), ) @@ -136,9 +135,9 @@ func (panel *UserPanel) sshAddRoute(ctx context.Context) http.Handler { tpl := sshAddTemplate.Prepare( panel.Dependencies.Templating, templating.Crumbs( - component.MenuItem{Title: "User", Path: "/user/"}, - component.MenuItem{Title: "SSH Keys", Path: "/user/ssh/"}, - component.MenuItem{Title: "Add New Key", Path: "/user/ssh/add/"}, + menuUser, + menuSSH, + menuSSHAdd, ), ) diff --git a/internal/dis/component/auth/panel/totp.go b/internal/dis/component/auth/panel/totp.go index 02df299..7a74588 100644 --- a/internal/dis/component/auth/panel/totp.go +++ b/internal/dis/component/auth/panel/totp.go @@ -5,7 +5,6 @@ import ( "html/template" "net/http" - "github.com/FAU-CDI/wisski-distillery/internal/dis/component" "github.com/FAU-CDI/wisski-distillery/internal/dis/component/auth" "github.com/FAU-CDI/wisski-distillery/internal/dis/component/server/assets" "github.com/FAU-CDI/wisski-distillery/internal/dis/component/server/templating" @@ -39,7 +38,7 @@ func (panel *UserPanel) routeTOTPEnable(ctx context.Context) http.Handler { }, RenderTemplate: tpl.Template(), - RenderTemplateContext: panel.UserFormContext(tpl, component.MenuItem{Title: "Enable TOTP", Path: "/user/totp/enable/"}), + RenderTemplateContext: panel.UserFormContext(tpl, menuTOTPEnable), Validate: func(r *http.Request, values map[string]string) (struct{}, error) { password := values["password"] @@ -93,8 +92,8 @@ func (panel *UserPanel) routeTOTPEnroll(ctx context.Context) http.Handler { tpl := totpEnrollTemplate.Prepare( panel.Dependencies.Templating, templating.Crumbs( - component.MenuItem{Title: "User", Path: "/user/"}, - component.MenuItem{Title: "Enable TOTP", Path: "/user/totp/enable/"}, + menuUser, + menuTOTPEnable, ), ) @@ -189,7 +188,7 @@ func (panel *UserPanel) routeTOTPDisable(ctx context.Context) http.Handler { return struct{}{}, err == nil && user != nil && !user.IsTOTPEnabled() }, RenderTemplate: tpl.Template(), - RenderTemplateContext: panel.UserFormContext(tpl, component.MenuItem{Title: "Disable TOTP", Path: "/user/totp/disable/"}), + RenderTemplateContext: panel.UserFormContext(tpl, menuTOTPDisable), Validate: func(r *http.Request, values map[string]string) (struct{}, error) { password, otp := values["password"], values["otp"] diff --git a/internal/dis/component/auth/panel/user.go b/internal/dis/component/auth/panel/user.go index 36a87e6..4df5960 100644 --- a/internal/dis/component/auth/panel/user.go +++ b/internal/dis/component/auth/panel/user.go @@ -34,21 +34,17 @@ type GrantWithURL struct { URL template.URL } -var ( - totpActionItem = component.DummyMenuItem() -) - func (panel *UserPanel) routeUser(ctx context.Context) http.Handler { tpl := userTemplate.Prepare( panel.Dependencies.Templating, templating.Crumbs( - component.MenuItem{Title: "User", Path: "/user/"}, + menuUser, ), templating.Actions( - component.MenuItem{Title: "Change Password", Path: "/user/password/"}, - totpActionItem, - component.MenuItem{Title: "SSH Keys", Path: "/user/ssh/"}, + menuChangePassword, + menuTOTPAction, + menuSSH, ), ) @@ -62,18 +58,12 @@ func (panel *UserPanel) routeUser(ctx context.Context) http.Handler { // replace the totp action in the menu var totpAction component.MenuItem if uc.AuthUser.IsTOTPEnabled() { - totpAction = component.MenuItem{ - Title: "Disable Passcode (TOTP)", - Path: "/user/totp/disable/", - } + totpAction = menuTOTPDisable } else { - totpAction = component.MenuItem{ - Title: "Enable Passcode (TOTP)", - Path: "/user/totp/enable/", - } + totpAction = menuTOTPEnable } funcs = []templating.FlagFunc{ - templating.ReplaceAction(totpActionItem, totpAction), + templating.ReplaceAction(menuTOTPAction, totpAction), templating.Title(uc.AuthUser.User.User), } diff --git a/internal/dis/component/resolver/resolver.go b/internal/dis/component/resolver/resolver.go index 7be75a0..08412ee 100644 --- a/internal/dis/component/resolver/resolver.go +++ b/internal/dis/component/resolver/resolver.go @@ -63,12 +63,16 @@ type resolverContext struct { wdresolve.IndexContext } +var ( + menuResolver = component.MenuItem{Title: "Resolver", Path: "/wisski/get/"} +) + func (resolver *Resolver) HandleRoute(ctx context.Context, route string) (http.Handler, error) { // get the resolver template tpl := resolverTemplate.Prepare( resolver.Dependencies.Templating, templating.Crumbs( - component.MenuItem{Title: "Resolver", Path: "/wisski/get/"}, + menuResolver, ), ) t := tpl.Template() diff --git a/internal/dis/component/server/admin/admin.go b/internal/dis/component/server/admin/admin.go index e9a2023..7e60082 100644 --- a/internal/dis/component/server/admin/admin.go +++ b/internal/dis/component/server/admin/admin.go @@ -63,6 +63,19 @@ func (admin *Admin) Menu(r *http.Request) []component.MenuItem { } } +var ( + menuAdmin = component.MenuItem{Title: "Admin", Path: "/admin/"} + menuComponents = component.MenuItem{Title: "Components", Path: "/admin/components/", Priority: component.SmallButton} + + menuUsers = component.MenuItem{Title: "Users", Path: "/admin/users/"} + menuUserCreate = component.MenuItem{Title: "Create User", Path: "/admin/users/create/"} + + menuInstances = component.MenuItem{Title: "Instances", Path: "/admin/instance/"} + menuInstance = component.DummyMenuItem() + menuGrants = component.DummyMenuItem() + menuIngredients = component.DummyMenuItem() +) + func (admin *Admin) HandleRoute(ctx context.Context, route string) (handler http.Handler, err error) { router := httprouter.New() diff --git a/internal/dis/component/server/admin/components.go b/internal/dis/component/server/admin/components.go index 37916d0..6feef93 100644 --- a/internal/dis/component/server/admin/components.go +++ b/internal/dis/component/server/admin/components.go @@ -34,9 +34,9 @@ func (admin *Admin) components(ctx context.Context) http.Handler { tpl := analTemplate.Prepare( admin.Dependencies.Templating, templating.Crumbs( - component.MenuItem{Title: "Admin", Path: "/admin/"}, - component.MenuItem{Title: "Instances", Path: "/admin/instance/"}, - component.MenuItem{Title: "Components", Path: "/admin/components/"}, + menuAdmin, + menuInstances, + menuComponents, ), templating.Title("Components"), ) @@ -47,19 +47,14 @@ func (admin *Admin) components(ctx context.Context) http.Handler { }) } -var ( - instanceCrumb = component.DummyMenuItem() - ingredientsCrumb = component.DummyMenuItem() -) - func (admin *Admin) ingredients(ctx context.Context) http.Handler { tpl := analTemplate.Prepare( admin.Dependencies.Templating, templating.Crumbs( - component.MenuItem{Title: "Admin", Path: "/admin/"}, - component.MenuItem{Title: "Instances", Path: "/admin/instance/"}, - instanceCrumb, - ingredientsCrumb, + menuAdmin, + menuInstances, + menuInstance, + menuIngredients, ), ) @@ -75,8 +70,8 @@ func (admin *Admin) ingredients(ctx context.Context) http.Handler { return ac, nil, err } funcs = []templating.FlagFunc{ - templating.ReplaceCrumb(instanceCrumb, component.MenuItem{Title: "Instance", Path: template.URL("/admin/instance/" + slug)}), - templating.ReplaceCrumb(ingredientsCrumb, component.MenuItem{Title: "Ingredients", Path: template.URL("/admin/instance/" + slug + "/ingredients/")}), + templating.ReplaceCrumb(menuInstance, component.MenuItem{Title: "Instance", Path: template.URL("/admin/instance/" + slug)}), + templating.ReplaceCrumb(menuIngredients, component.MenuItem{Title: "Ingredients", Path: template.URL("/admin/instance/" + slug + "/ingredients/")}), templating.Title(instance.Name() + " - Ingredients"), } diff --git a/internal/dis/component/server/admin/grants.go b/internal/dis/component/server/admin/grants.go index 21845ca..df104a0 100644 --- a/internal/dis/component/server/admin/grants.go +++ b/internal/dis/component/server/admin/grants.go @@ -41,19 +41,14 @@ type grantsContext struct { Drupals []string // unusued drupal usernames } -var ( - instancePageCrumb = component.DummyMenuItem() - grantsPageCrumb = component.DummyMenuItem() -) - func (admin *Admin) grants(ctx context.Context) http.Handler { tpl := grantsTemplate.Prepare( admin.Dependencies.Templating, templating.Crumbs( - component.MenuItem{Title: "Admin", Path: "/admin/"}, - component.MenuItem{Title: "Instances", Path: "/admin/instance/"}, - instancePageCrumb, - grantsPageCrumb, + menuAdmin, + menuInstances, + menuInstance, + menuGrants, ), ) @@ -142,8 +137,8 @@ func (gc *grantsContext) use(r *http.Request, slug string, admin *Admin) (funcs // replace the functions funcs = []templating.FlagFunc{ - templating.ReplaceCrumb(instancePageCrumb, component.MenuItem{Title: "Instance", Path: template.URL("/admin/instance/" + slug)}), - templating.ReplaceCrumb(grantsPageCrumb, component.MenuItem{Title: "Grants", Path: template.URL("/admin/instance/" + slug + "/grants/")}), + templating.ReplaceCrumb(menuInstance, component.MenuItem{Title: "Instance", Path: template.URL("/admin/instance/" + slug)}), + templating.ReplaceCrumb(menuGrants, component.MenuItem{Title: "Grants", Path: template.URL("/admin/instance/" + slug + "/grants/")}), templating.Title(gc.Instance.Slug + " - Grants"), } return funcs, nil diff --git a/internal/dis/component/server/admin/index.go b/internal/dis/component/server/admin/index.go index 7026f52..8743f76 100644 --- a/internal/dis/component/server/admin/index.go +++ b/internal/dis/component/server/admin/index.go @@ -85,6 +85,10 @@ var indexTemplate = templating.Parse[indexContext]( templating.Title("Admin"), templating.Assets(assets.AssetsAdmin), + + templating.Crumbs( + menuAdmin, + ), ) //go:embed "html/instances.html" @@ -106,13 +110,10 @@ type indexContext struct { func (admin *Admin) index(ctx context.Context) http.Handler { tpl := indexTemplate.Prepare( admin.Dependencies.Templating, - templating.Crumbs( - component.MenuItem{Title: "Admin", Path: "/admin/"}, - ), templating.Actions( - component.MenuItem{Title: "Users", Path: "/admin/users/"}, - component.MenuItem{Title: "Instances", Path: "/admin/instance/"}, - component.MenuItem{Title: "Components", Path: "/admin/components/", Priority: component.SmallButton}, + menuUsers, + menuInstances, + menuComponents, ), ) @@ -126,8 +127,8 @@ func (admin *Admin) instances(ctx context.Context) http.Handler { tpl := instancesTemplate.Prepare( admin.Dependencies.Templating, templating.Crumbs( - component.MenuItem{Title: "Admin", Path: "/admin/"}, - component.MenuItem{Title: "Instances", Path: "/admin/instance/"}, + menuAdmin, + menuInstances, ), ) diff --git a/internal/dis/component/server/admin/instance.go b/internal/dis/component/server/admin/instance.go index 39c40fb..298b1eb 100644 --- a/internal/dis/component/server/admin/instance.go +++ b/internal/dis/component/server/admin/instance.go @@ -31,23 +31,17 @@ type instanceContext struct { Info status.WissKI } -var ( - instancesPageCrumb = component.DummyMenuItem() - grantsAction = component.DummyMenuItem() - ingredientsAction = component.DummyMenuItem() -) - func (admin *Admin) instance(ctx context.Context) http.Handler { tpl := instanceTemplate.Prepare( admin.Dependencies.Templating, templating.Crumbs( - component.MenuItem{Title: "Admin", Path: "/admin/"}, - component.MenuItem{Title: "Instances", Path: "/admin/instance/"}, - instancesPageCrumb, + menuAdmin, + menuInstances, + menuInstance, ), templating.Actions( - grantsAction, - ingredientsAction, + menuGrants, + menuIngredients, ), ) @@ -71,9 +65,9 @@ func (admin *Admin) instance(ctx context.Context) http.Handler { } funcs = []templating.FlagFunc{ - templating.ReplaceCrumb(instancesPageCrumb, component.MenuItem{Title: "Instance", Path: template.URL("/admin/instance/" + slug)}), - templating.ReplaceAction(grantsAction, component.MenuItem{Title: "Grants", Path: template.URL("/admin/grants/" + slug)}), - templating.ReplaceAction(ingredientsAction, component.MenuItem{Title: "Ingredients", Path: template.URL("/admin/ingredients/" + slug), Priority: component.SmallButton}), + templating.ReplaceCrumb(menuInstance, component.MenuItem{Title: "Instance", Path: template.URL("/admin/instance/" + slug)}), + templating.ReplaceAction(menuGrants, component.MenuItem{Title: "Grants", Path: template.URL("/admin/grants/" + slug)}), + templating.ReplaceAction(menuIngredients, component.MenuItem{Title: "Ingredients", Path: template.URL("/admin/ingredients/" + slug), Priority: component.SmallButton}), templating.Title(instance.Slug), } diff --git a/internal/dis/component/server/admin/users.go b/internal/dis/component/server/admin/users.go index 13db73e..3bf960b 100644 --- a/internal/dis/component/server/admin/users.go +++ b/internal/dis/component/server/admin/users.go @@ -8,7 +8,6 @@ import ( _ "embed" - "github.com/FAU-CDI/wisski-distillery/internal/dis/component" "github.com/FAU-CDI/wisski-distillery/internal/dis/component/auth" "github.com/FAU-CDI/wisski-distillery/internal/dis/component/server/assets" "github.com/FAU-CDI/wisski-distillery/internal/dis/component/server/templating" @@ -36,11 +35,11 @@ func (admin *Admin) users(ctx context.Context) http.Handler { tpl := usersTemplate.Prepare( admin.Dependencies.Templating, templating.Crumbs( - component.MenuItem{Title: "Admin", Path: "/admin/"}, - component.MenuItem{Title: "Users", Path: "/admin/users/"}, + menuAdmin, + menuUsers, ), templating.Actions( - component.MenuItem{Title: "Create New", Path: "/admin/users/create/"}, + menuUserCreate, ), ) @@ -75,9 +74,9 @@ func (admin *Admin) createUser(ctx context.Context) http.Handler { tpl := userCreateTemplate.Prepare( admin.Dependencies.Templating, templating.Crumbs( - component.MenuItem{Title: "Admin", Path: "/admin/"}, - component.MenuItem{Title: "Users", Path: "/admin/users"}, - component.MenuItem{Title: "Create", Path: "/admin/users/create"}, + menuAdmin, + menuUsers, + menuUserCreate, ), ) diff --git a/internal/dis/component/server/home/home.go b/internal/dis/component/server/home/home.go index fda0993..d9bf898 100644 --- a/internal/dis/component/server/home/home.go +++ b/internal/dis/component/server/home/home.go @@ -38,6 +38,10 @@ func (*Home) Routes() component.Routes { } } +var ( + menuHome = component.MenuItem{Title: "WissKI Distillery", Path: "/"} +) + func (home *Home) HandleRoute(ctx context.Context, route string) (http.Handler, error) { // generate a default handler dflt, err := home.loadRedirect(ctx) diff --git a/internal/dis/component/server/home/public.go b/internal/dis/component/server/home/public.go index ac2f9ef..2ecad6c 100644 --- a/internal/dis/component/server/home/public.go +++ b/internal/dis/component/server/home/public.go @@ -7,7 +7,6 @@ import ( "net/http" "strings" - "github.com/FAU-CDI/wisski-distillery/internal/dis/component" "github.com/FAU-CDI/wisski-distillery/internal/dis/component/server/assets" "github.com/FAU-CDI/wisski-distillery/internal/dis/component/server/templating" "github.com/FAU-CDI/wisski-distillery/internal/status" @@ -47,7 +46,7 @@ func (home *Home) publicHandler(ctx context.Context) http.Handler { tpl := publicTemplate.Prepare( home.Dependencies.Templating, templating.Crumbs( - component.MenuItem{Title: "WissKI Distillery", Path: "/"}, + menuHome, ), ) diff --git a/internal/dis/component/server/legal/legal.go b/internal/dis/component/server/legal/legal.go index 2e5ac9f..b2d3f06 100644 --- a/internal/dis/component/server/legal/legal.go +++ b/internal/dis/component/server/legal/legal.go @@ -53,11 +53,15 @@ func (legal *Legal) Routes() component.Routes { } } +var ( + menuLegal = component.MenuItem{Title: "Legal", Path: "/legal/"} +) + func (legal *Legal) HandleRoute(ctx context.Context, route string) (http.Handler, error) { tpl := legalTemplate.Prepare( legal.Dependencies.Templating, templating.Crumbs( - component.MenuItem{Title: "Legal", Path: "/legal/"}, + menuLegal, ), ) diff --git a/internal/dis/component/server/news/news.go b/internal/dis/component/server/news/news.go index 19b110d..86354df 100644 --- a/internal/dis/component/server/news/news.go +++ b/internal/dis/component/server/news/news.go @@ -127,12 +127,16 @@ type newsContext struct { Items []Item } +var ( + menuNews = component.MenuItem{Title: "News", Path: "/news/"} +) + // HandleRoute returns the handler for the requested path func (news *News) HandleRoute(ctx context.Context, path string) (http.Handler, error) { tpl := newsTemplate.Prepare( news.Dependencies.Templating, templating.Crumbs( - component.MenuItem{Title: "News", Path: "/news/"}, + menuNews, ), )