From df0bc7bbc4ece3982bf6a9de3f2c701cfb5e03ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Fri, 20 Nov 2015 09:43:10 +0100 Subject: [PATCH] feat(external_plugin): lots of refactoring for side menu link extensions and view data, #3185 --- pkg/api/dtos/index.go | 20 +++++ pkg/api/externalplugin.go | 5 +- pkg/api/index.go | 95 ++++++++++---------- pkg/api/login.go | 12 +-- pkg/login/ldap.go | 2 +- pkg/plugins/models.go | 12 +-- public/app/app.js | 5 +- public/app/core/config.js | 1 + public/app/core/controllers/sidemenu_ctrl.js | 28 ++---- public/app/core/services/context_srv.js | 4 +- public/test/test-main.js | 2 +- public/views/index.html | 9 +- 12 files changed, 100 insertions(+), 95 deletions(-) create mode 100644 pkg/api/dtos/index.go 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 - - if setting.GoogleAnalyticsId != "" { - c.Data["GoogleAnalyticsId"] = setting.GoogleAnalyticsId - } - - if setting.GoogleTagManagerId != "" { - c.Data["GoogleTagManagerId"] = setting.GoogleTagManagerId + data.MainNavLinks = append(data.MainNavLinks, &dtos.NavLink{ + Text: "Dashboards", + Icon: "fa fa-fw fa-th-large", + Href: "/", + }) + + if c.OrgRole == m.ROLE_ADMIN { + data.MainNavLinks = append(data.MainNavLinks, &dtos.NavLink{ + Text: "Data Sources", + Icon: "fa fa-fw fa-database", + Href: "/datasources", + }) } - 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"), - }); - } - - 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) - }); - } + 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) {