diff --git a/pkg/api/index.go b/pkg/api/index.go index 4fe1e436a32..5459be8aff4 100644 --- a/pkg/api/index.go +++ b/pkg/api/index.go @@ -169,7 +169,7 @@ func (hs *HTTPServer) ReqCanAdminTeams(c *models.ReqContext) bool { func (hs *HTTPServer) getNavTree(c *models.ReqContext, hasEditPerm bool, prefs *pref.Preference) ([]*dtos.NavLink, error) { hasAccess := ac.HasAccess(hs.AccessControl, c) - navTree := []*dtos.NavLink{} + var navTree []*dtos.NavLink if hasAccess(ac.ReqSignedIn, ac.EvalPermission(dashboards.ActionDashboardsRead)) { starredItemsLinks, err := hs.buildStarredItemsNavLinks(c, prefs) @@ -254,8 +254,78 @@ func (hs *HTTPServer) getNavTree(c *models.ReqContext, hasEditPerm bool, prefs * navTree = append(navTree, appLinks...) } - configNodes := []*dtos.NavLink{} + configNodes, err := hs.setupConfigNodes(c) + if err != nil { + return navTree, err + } + + if hs.Features.IsEnabled(featuremgmt.FlagLivePipeline) { + liveNavLinks := []*dtos.NavLink{} + + liveNavLinks = append(liveNavLinks, &dtos.NavLink{ + Text: "Status", Id: "live-status", Url: hs.Cfg.AppSubURL + "/live", Icon: "exchange-alt", + }) + liveNavLinks = append(liveNavLinks, &dtos.NavLink{ + Text: "Pipeline", Id: "live-pipeline", Url: hs.Cfg.AppSubURL + "/live/pipeline", Icon: "arrow-to-right", + }) + liveNavLinks = append(liveNavLinks, &dtos.NavLink{ + Text: "Cloud", Id: "live-cloud", Url: hs.Cfg.AppSubURL + "/live/cloud", Icon: "cloud-upload", + }) + navTree = append(navTree, &dtos.NavLink{ + Id: "live", + Text: "Live", + SubTitle: "Event streaming", + Icon: "exchange-alt", + Url: hs.Cfg.AppSubURL + "/live", + Children: liveNavLinks, + Section: dtos.NavSectionConfig, + HideFromTabs: true, + }) + } + + var configNode *dtos.NavLink + var serverAdminNode *dtos.NavLink + + if len(configNodes) > 0 { + configNode = &dtos.NavLink{ + Id: dtos.NavIDCfg, + Text: "Configuration", + SubTitle: "Organization: " + c.OrgName, + Icon: "cog", + Url: configNodes[0].Url, + Section: dtos.NavSectionConfig, + SortWeight: dtos.WeightConfig, + Children: configNodes, + } + navTree = append(navTree, configNode) + } + + adminNavLinks := hs.buildAdminNavLinks(c) + + if len(adminNavLinks) > 0 { + serverAdminNode = navlinks.GetServerAdminNode(adminNavLinks) + navTree = append(navTree, serverAdminNode) + } + + if hs.Features.IsEnabled(featuremgmt.FlagTopnav) { + // Move server admin into Configuration and rename to administration + if configNode != nil && serverAdminNode != nil { + configNode.Text = "Administration" + configNode.Children = append(configNode.Children, serverAdminNode) + adminNodeIndex := len(navTree) - 1 + navTree = navTree[:adminNodeIndex] + } + } + + navTree = hs.addHelpLinks(navTree, c) + + return navTree, nil +} +func (hs *HTTPServer) setupConfigNodes(c *models.ReqContext) ([]*dtos.NavLink, error) { + var configNodes []*dtos.NavLink + + hasAccess := ac.HasAccess(hs.AccessControl, c) if hasAccess(ac.ReqOrgAdmin, datasources.ConfigurationPageAccess) { configNodes = append(configNodes, &dtos.NavLink{ Text: "Data sources", @@ -319,7 +389,7 @@ func (hs *HTTPServer) getNavTree(c *models.ReqContext, hasEditPerm bool, prefs * hideApiKeys, _, _ := hs.kvStore.Get(c.Req.Context(), c.OrgID, "serviceaccounts", "hideApiKeys") apiKeys, err := hs.apiKeyService.GetAllAPIKeys(c.Req.Context(), c.OrgID) if err != nil { - return navTree, err + return nil, err } apiKeysHidden := hideApiKeys == "1" && len(apiKeys) == 0 if hasAccess(ac.ReqOrgAdmin, apiKeyAccessEvaluator) && !apiKeysHidden { @@ -342,67 +412,7 @@ func (hs *HTTPServer) getNavTree(c *models.ReqContext, hasEditPerm bool, prefs * }) } - if hs.Features.IsEnabled(featuremgmt.FlagLivePipeline) { - liveNavLinks := []*dtos.NavLink{} - - liveNavLinks = append(liveNavLinks, &dtos.NavLink{ - Text: "Status", Id: "live-status", Url: hs.Cfg.AppSubURL + "/live", Icon: "exchange-alt", - }) - liveNavLinks = append(liveNavLinks, &dtos.NavLink{ - Text: "Pipeline", Id: "live-pipeline", Url: hs.Cfg.AppSubURL + "/live/pipeline", Icon: "arrow-to-right", - }) - liveNavLinks = append(liveNavLinks, &dtos.NavLink{ - Text: "Cloud", Id: "live-cloud", Url: hs.Cfg.AppSubURL + "/live/cloud", Icon: "cloud-upload", - }) - navTree = append(navTree, &dtos.NavLink{ - Id: "live", - Text: "Live", - SubTitle: "Event streaming", - Icon: "exchange-alt", - Url: hs.Cfg.AppSubURL + "/live", - Children: liveNavLinks, - Section: dtos.NavSectionConfig, - HideFromTabs: true, - }) - } - - var configNode *dtos.NavLink - var serverAdminNode *dtos.NavLink - - if len(configNodes) > 0 { - configNode = &dtos.NavLink{ - Id: dtos.NavIDCfg, - Text: "Configuration", - SubTitle: "Organization: " + c.OrgName, - Icon: "cog", - Url: configNodes[0].Url, - Section: dtos.NavSectionConfig, - SortWeight: dtos.WeightConfig, - Children: configNodes, - } - navTree = append(navTree, configNode) - } - - adminNavLinks := hs.buildAdminNavLinks(c) - - if len(adminNavLinks) > 0 { - serverAdminNode = navlinks.GetServerAdminNode(adminNavLinks) - navTree = append(navTree, serverAdminNode) - } - - if hs.Features.IsEnabled(featuremgmt.FlagTopnav) { - // Move server admin into Configuration and rename to administration - if configNode != nil && serverAdminNode != nil { - configNode.Text = "Administration" - configNode.Children = append(configNode.Children, serverAdminNode) - adminNodeIndex := len(navTree) - 1 - navTree = navTree[:adminNodeIndex] - } - } - - navTree = hs.addHelpLinks(navTree, c) - - return navTree, nil + return configNodes, nil } func (hs *HTTPServer) addProfile(navTree []*dtos.NavLink, c *models.ReqContext) []*dtos.NavLink {