app_plugin.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package plugins
  2. import (
  3. "encoding/json"
  4. "strings"
  5. "github.com/gosimple/slug"
  6. "github.com/grafana/grafana/pkg/models"
  7. )
  8. type AppPluginPage struct {
  9. Name string `json:"name"`
  10. Slug string `json:"slug"`
  11. Component string `json:"component"`
  12. Role models.RoleType `json:"role"`
  13. }
  14. type AppPluginCss struct {
  15. Light string `json:"light"`
  16. Dark string `json:"dark"`
  17. }
  18. type AppIncludeInfo struct {
  19. Name string `json:"name"`
  20. Type string `json:"type"`
  21. Id string `json:"id"`
  22. }
  23. type AppPlugin struct {
  24. FrontendPluginBase
  25. Css *AppPluginCss `json:"css"`
  26. Pages []*AppPluginPage `json:"pages"`
  27. Routes []*AppPluginRoute `json:"routes"`
  28. Includes []*AppIncludeInfo `json:"-"`
  29. Pinned bool `json:"-"`
  30. Enabled bool `json:"-"`
  31. }
  32. type AppPluginRoute struct {
  33. Path string `json:"path"`
  34. Method string `json:"method"`
  35. ReqSignedIn bool `json:"reqSignedIn"`
  36. ReqGrafanaAdmin bool `json:"reqGrafanaAdmin"`
  37. ReqRole models.RoleType `json:"reqRole"`
  38. Url string `json:"url"`
  39. Headers []AppPluginRouteHeader `json:"headers"`
  40. }
  41. type AppPluginRouteHeader struct {
  42. Name string `json:"name"`
  43. Content string `json:"content"`
  44. }
  45. func (app *AppPlugin) Load(decoder *json.Decoder, pluginDir string) error {
  46. if err := decoder.Decode(&app); err != nil {
  47. return err
  48. }
  49. if app.Css != nil {
  50. app.Css.Dark = evalRelativePluginUrlPath(app.Css.Dark, app.Id)
  51. app.Css.Light = evalRelativePluginUrlPath(app.Css.Light, app.Id)
  52. }
  53. app.PluginDir = pluginDir
  54. app.initFrontendPlugin()
  55. // check if we have child panels
  56. for _, panel := range Panels {
  57. if strings.HasPrefix(panel.PluginDir, app.PluginDir) {
  58. panel.IncludedInAppId = app.Id
  59. app.Includes = append(app.Includes, &AppIncludeInfo{
  60. Name: panel.Name,
  61. Id: panel.Id,
  62. Type: panel.Type,
  63. })
  64. }
  65. }
  66. for _, page := range app.Pages {
  67. if page.Slug == "" {
  68. page.Slug = slug.Make(page.Name)
  69. }
  70. }
  71. Apps[app.Id] = app
  72. return nil
  73. }