diff --git a/pkg/api/dtos/index.go b/pkg/api/dtos/index.go
new file mode 100644
index 00000000000..88a694f542a
--- /dev/null
+++ b/pkg/api/dtos/index.go
@@ -0,0 +1,20 @@
+package dtos
+
+type IndexViewData struct {
+ User *CurrentUser
+ Settings map[string]interface{}
+ AppUrl string
+ AppSubUrl string
+ GoogleAnalyticsId string
+ GoogleTagManagerId string
+
+ PluginCss []string
+ PluginJs []string
+ MainNavLinks []*NavLink
+}
+
+type NavLink struct {
+ Text string `json:"text"`
+ Icon string `json:"icon"`
+ Href string `json:"href"`
+}
diff --git a/pkg/api/externalplugin.go b/pkg/api/externalplugin.go
index fe9e3b54d71..e4a7b8639c1 100644
--- a/pkg/api/externalplugin.go
+++ b/pkg/api/externalplugin.go
@@ -34,8 +34,9 @@ func InitExternalPluginRoutes(r *macaron.Macaron) {
for _, plugin := range plugins.ExternalPlugins {
log.Info("Plugin: Adding proxy routes for backend plugin")
for _, route := range plugin.Routes {
- log.Info("Plugin: Adding route %s /api/plugin-proxy/%s", route.Method, route.Path)
- r.Route(util.JoinUrlFragments("/api/plugin-proxy/", route.Path), route.Method, ExternalPlugin(route.Url))
+ url := util.JoinUrlFragments("/api/plugin-proxy/", route.Path)
+ r.Route(url, route.Method, ExternalPlugin(route.Url))
+ log.Info("Plugin: Adding route %s", url)
}
}
}
diff --git a/pkg/api/index.go b/pkg/api/index.go
index b87075e08f1..fb18045a18a 100644
--- a/pkg/api/index.go
+++ b/pkg/api/index.go
@@ -3,84 +3,87 @@ package api
import (
"github.com/grafana/grafana/pkg/api/dtos"
"github.com/grafana/grafana/pkg/middleware"
+ m "github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/setting"
)
-func setIndexViewData(c *middleware.Context) error {
+func setIndexViewData(c *middleware.Context) (*dtos.IndexViewData, error) {
settings, err := getFrontendSettingsMap(c)
if err != nil {
- return err
+ return nil, err
}
- currentUser := &dtos.CurrentUser{
- Id: c.UserId,
- IsSignedIn: c.IsSignedIn,
- Login: c.Login,
- Email: c.Email,
- Name: c.Name,
- LightTheme: c.Theme == "light",
- OrgId: c.OrgId,
- OrgName: c.OrgName,
- OrgRole: c.OrgRole,
- GravatarUrl: dtos.GetGravatarUrl(c.Email),
- IsGrafanaAdmin: c.IsGrafanaAdmin,
+ var data = dtos.IndexViewData{
+ User: &dtos.CurrentUser{
+ Id: c.UserId,
+ IsSignedIn: c.IsSignedIn,
+ Login: c.Login,
+ Email: c.Email,
+ Name: c.Name,
+ LightTheme: c.Theme == "light",
+ OrgId: c.OrgId,
+ OrgName: c.OrgName,
+ OrgRole: c.OrgRole,
+ GravatarUrl: dtos.GetGravatarUrl(c.Email),
+ IsGrafanaAdmin: c.IsGrafanaAdmin,
+ },
+ Settings: settings,
+ AppUrl: setting.AppUrl,
+ AppSubUrl: setting.AppSubUrl,
+ GoogleAnalyticsId: setting.GoogleAnalyticsId,
+ GoogleTagManagerId: setting.GoogleTagManagerId,
}
if setting.DisableGravatar {
- currentUser.GravatarUrl = setting.AppSubUrl + "/img/user_profile.png"
+ data.User.GravatarUrl = setting.AppSubUrl + "/img/user_profile.png"
}
- if len(currentUser.Name) == 0 {
- currentUser.Name = currentUser.Login
+ if len(data.User.Name) == 0 {
+ data.User.Name = data.User.Login
}
themeUrlParam := c.Query("theme")
if themeUrlParam == "light" {
- currentUser.LightTheme = true
+ data.User.LightTheme = true
}
- c.Data["User"] = currentUser
- c.Data["Settings"] = settings
- c.Data["AppUrl"] = setting.AppUrl
- c.Data["AppSubUrl"] = setting.AppSubUrl
+ data.MainNavLinks = append(data.MainNavLinks, &dtos.NavLink{
+ Text: "Dashboards",
+ Icon: "fa fa-fw fa-th-large",
+ Href: "/",
+ })
- if setting.GoogleAnalyticsId != "" {
- c.Data["GoogleAnalyticsId"] = setting.GoogleAnalyticsId
+ if c.OrgRole == m.ROLE_ADMIN {
+ data.MainNavLinks = append(data.MainNavLinks, &dtos.NavLink{
+ Text: "Data Sources",
+ Icon: "fa fa-fw fa-database",
+ Href: "/datasources",
+ })
}
- if setting.GoogleTagManagerId != "" {
- c.Data["GoogleTagManagerId"] = setting.GoogleTagManagerId
- }
-
- externalPluginJs := make([]string, 0)
- externalPluginCss := make([]string, 0)
- externalPluginMenu := make([]*plugins.ExternalPluginMenuItem, 0)
for _, plugin := range plugins.ExternalPlugins {
for _, js := range plugin.Js {
- externalPluginJs = append(externalPluginJs, js.Module)
+ data.PluginJs = append(data.PluginJs, js.Module)
}
for _, css := range plugin.Css {
- externalPluginCss = append(externalPluginCss, css.Href)
+ data.PluginCss = append(data.PluginCss, css.Href)
}
- for _, item := range plugin.MenuItems {
- externalPluginMenu = append(externalPluginMenu, item)
+ for _, item := range plugin.MainNavLinks {
+ data.MainNavLinks = append(data.MainNavLinks, &dtos.NavLink{Text: item.Text, Href: item.Href, Icon: item.Icon})
}
}
- c.Data["ExternalPluginJs"] = externalPluginJs
- c.Data["ExternalPluginCss"] = externalPluginCss
- c.Data["ExternalPluginMenu"] = externalPluginMenu
- return nil
+ return &data, nil
}
func Index(c *middleware.Context) {
- if err := setIndexViewData(c); err != nil {
+ if data, err := setIndexViewData(c); err != nil {
c.Handle(500, "Failed to get settings", err)
return
+ } else {
+ c.HTML(200, "index", data)
}
-
- c.HTML(200, "index")
}
func NotFoundHandler(c *middleware.Context) {
@@ -89,10 +92,10 @@ func NotFoundHandler(c *middleware.Context) {
return
}
- if err := setIndexViewData(c); err != nil {
+ if data, err := setIndexViewData(c); err != nil {
c.Handle(500, "Failed to get settings", err)
return
+ } else {
+ c.HTML(404, "index", data)
}
-
- c.HTML(404, "index")
}
diff --git a/pkg/api/login.go b/pkg/api/login.go
index 8863e1b10c1..d7856ebbaad 100644
--- a/pkg/api/login.go
+++ b/pkg/api/login.go
@@ -19,18 +19,18 @@ const (
)
func LoginView(c *middleware.Context) {
- if err := setIndexViewData(c); err != nil {
+ viewData, err := setIndexViewData(c)
+ if err != nil {
c.Handle(500, "Failed to get settings", err)
return
}
- settings := c.Data["Settings"].(map[string]interface{})
- settings["googleAuthEnabled"] = setting.OAuthService.Google
- settings["githubAuthEnabled"] = setting.OAuthService.GitHub
- settings["disableUserSignUp"] = !setting.AllowUserSignUp
+ viewData.Settings["googleAuthEnabled"] = setting.OAuthService.Google
+ viewData.Settings["githubAuthEnabled"] = setting.OAuthService.GitHub
+ viewData.Settings["disableUserSignUp"] = !setting.AllowUserSignUp
if !tryLoginUsingRememberCookie(c) {
- c.HTML(200, VIEW_INDEX)
+ c.HTML(200, VIEW_INDEX, viewData)
return
}
diff --git a/pkg/login/ldap.go b/pkg/login/ldap.go
index 355b4fd100a..24c6a99a8f5 100644
--- a/pkg/login/ldap.go
+++ b/pkg/login/ldap.go
@@ -131,8 +131,8 @@ func (a *ldapAuther) getGrafanaUserFor(ldapUser *ldapUserInfo) (*m.User, error)
}
return userQuery.Result, nil
-}
+}
func (a *ldapAuther) createGrafanaUser(ldapUser *ldapUserInfo) (*m.User, error) {
cmd := m.CreateUserCommand{
Login: ldapUser.Username,
diff --git a/pkg/plugins/models.go b/pkg/plugins/models.go
index c67936e2624..42a641847aa 100644
--- a/pkg/plugins/models.go
+++ b/pkg/plugins/models.go
@@ -33,7 +33,7 @@ type ExternalPluginJs struct {
Module string `json:"module"`
}
-type ExternalPluginMenuItem struct {
+type ExternalPluginNavLink struct {
Text string `json:"text"`
Icon string `json:"icon"`
Href string `json:"href"`
@@ -44,9 +44,9 @@ type ExternalPluginCss struct {
}
type ExternalPlugin struct {
- Routes []*ExternalPluginRoute `json:"routes"`
- Js []*ExternalPluginJs `json:"js"`
- Css []*ExternalPluginCss `json:"css"`
- MenuItems []*ExternalPluginMenuItem `json:"menuItems"`
- StaticRootConfig *StaticRootConfig `json:"staticRoot"`
+ Routes []*ExternalPluginRoute `json:"routes"`
+ Js []*ExternalPluginJs `json:"js"`
+ Css []*ExternalPluginCss `json:"css"`
+ MainNavLinks []*ExternalPluginNavLink `json:"mainNavLinks"`
+ StaticRootConfig *StaticRootConfig `json:"staticRoot"`
}
diff --git a/public/app/app.js b/public/app/app.js
index 6664c30aad2..b8d6579dea1 100644
--- a/public/app/app.js
+++ b/public/app/app.js
@@ -2,6 +2,7 @@ define([
'angular',
'jquery',
'lodash',
+ 'app/core/config',
'require',
'bootstrap',
'angular-route',
@@ -12,7 +13,7 @@ define([
'bindonce',
'app/core/core',
],
-function (angular, $, _, appLevelRequire) {
+function (angular, $, _, config, appLevelRequire) {
"use strict";
var app = angular.module('grafana', []);
@@ -69,7 +70,7 @@ function (angular, $, _, appLevelRequire) {
});
var preBootRequires = ['app/features/all'];
- var pluginModules = window.grafanaBootData.pluginModules || [];
+ var pluginModules = config.bootData.pluginModules || [];
// add plugin modules
for (var i = 0; i < pluginModules.length; i++) {
diff --git a/public/app/core/config.js b/public/app/core/config.js
index f8e7bb228a2..410d47f7b9a 100644
--- a/public/app/core/config.js
+++ b/public/app/core/config.js
@@ -6,6 +6,7 @@ function (Settings) {
var bootData = window.grafanaBootData || { settings: {} };
var options = bootData.settings;
+ options.bootData = bootData;
return new Settings(options);
diff --git a/public/app/core/controllers/sidemenu_ctrl.js b/public/app/core/controllers/sidemenu_ctrl.js
index 3ccee600384..a2885674d34 100644
--- a/public/app/core/controllers/sidemenu_ctrl.js
+++ b/public/app/core/controllers/sidemenu_ctrl.js
@@ -15,31 +15,13 @@ function (angular, _, $, coreModule, config) {
};
$scope.setupMainNav = function() {
- $scope.mainLinks.push({
- text: "Dashboards",
- icon: "fa fa-fw fa-th-large",
- href: $scope.getUrl("/"),
- });
-
- if (contextSrv.hasRole('Admin')) {
+ _.each(config.bootData.mainNavLinks, function(item) {
$scope.mainLinks.push({
- text: "Data Sources",
- icon: "fa fa-fw fa-database",
- href: $scope.getUrl("/datasources"),
+ text: item.text,
+ icon: item.icon,
+ href: $scope.getUrl(item.href)
});
- }
-
- if (_.isArray(window.externalPlugins.mainLinks)) {
- _.forEach(window.externalPlugins.mainLinks, function(item) {
- if (!item.adminOnly || contextSrv.hasRole('Admin')) {
- $scope.mainLinks.push({
- text: item.text,
- icon: item.icon,
- href: $scope.getUrl(item.href)
- });
- }
- });
- }
+ });
};
$scope.loadOrgs = function() {
diff --git a/public/app/core/services/context_srv.js b/public/app/core/services/context_srv.js
index 77f10fdf16a..b06a84fe5c3 100644
--- a/public/app/core/services/context_srv.js
+++ b/public/app/core/services/context_srv.js
@@ -12,8 +12,8 @@ function (angular, _, coreModule, store, config) {
var self = this;
function User() {
- if (window.grafanaBootData.user) {
- _.extend(this, window.grafanaBootData.user);
+ if (config.bootData.user) {
+ _.extend(this, config.bootData.user);
}
}
diff --git a/public/test/test-main.js b/public/test/test-main.js
index 7b674ff6eff..0cdbaac20e5 100644
--- a/public/test/test-main.js
+++ b/public/test/test-main.js
@@ -95,7 +95,7 @@ function file2moduleName(filePath) {
.replace(/\.\w*$/, '');
}
-window.grafanaBootData = {};
+window.grafanaBootData = {settings: {}};
require([
'lodash',
diff --git a/public/views/index.html b/public/views/index.html
index 94d5671a9f2..2932276c62f 100644
--- a/public/views/index.html
+++ b/public/views/index.html
@@ -14,7 +14,7 @@
[[end]]
- [[ range $css := .ExternalPluginCss ]]
+ [[ range $css := .PluginCss ]]
[[ end ]]
@@ -54,11 +54,8 @@
window.grafanaBootData = {
user:[[.User]],
settings: [[.Settings]],
- pluginModules: [[.ExternalPluginJs]],
- };
-
- window.externalPlugins = {
- mainLinks: [[.ExternalPluginMenu]]
+ pluginModules: [[.PluginJs]],
+ mainNavLinks: [[.MainNavLinks]]
};
require(['app/app'], function (app) {