|
|
|
@ -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 { |
|
|
|
|