diff --git a/pkg/api/api.go b/pkg/api/api.go index c21deae5a59..90d613e46e0 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -126,9 +126,9 @@ func Register(r *macaron.Macaron) { r.Patch("/invites/:code/revoke", wrap(RevokeInvite)) // apps - r.Get("/apps", wrap(GetOrgAppsList)) - r.Get("/apps/:appId/settings", wrap(GetAppSettingsById)) - r.Post("/apps/:appId/settings", bind(m.UpdateAppSettingsCmd{}), wrap(UpdateAppSettings)) + r.Get("/plugins", wrap(GetPluginList)) + r.Get("/plugins/:pluginId/settings", wrap(GetPluginSettingById)) + r.Post("/plugins/:pluginId/settings", bind(m.UpdatePluginSettingCmd{}), wrap(UpdatePluginSetting)) }, reqOrgAdmin) // create new org diff --git a/pkg/api/app_settings.go b/pkg/api/app_settings.go deleted file mode 100644 index fd0f1a1eab1..00000000000 --- a/pkg/api/app_settings.go +++ /dev/null @@ -1,59 +0,0 @@ -package api - -import ( - "github.com/grafana/grafana/pkg/api/dtos" - "github.com/grafana/grafana/pkg/bus" - "github.com/grafana/grafana/pkg/middleware" - m "github.com/grafana/grafana/pkg/models" - "github.com/grafana/grafana/pkg/plugins" -) - -func GetOrgAppsList(c *middleware.Context) Response { - orgApps, err := plugins.GetOrgAppSettings(c.OrgId) - - if err != nil { - return ApiError(500, "Failed to list of apps", err) - } - - result := make([]*dtos.AppSettings, 0) - for _, app := range plugins.Apps { - orgApp := orgApps[app.Id] - result = append(result, dtos.NewAppSettingsDto(app, orgApp)) - } - - return Json(200, result) -} - -func GetAppSettingsById(c *middleware.Context) Response { - appId := c.Params(":appId") - - if pluginDef, exists := plugins.Apps[appId]; !exists { - return ApiError(404, "PluginId not found, no installed plugin with that id", nil) - } else { - orgApps, err := plugins.GetOrgAppSettings(c.OrgId) - if err != nil { - return ApiError(500, "Failed to get org app settings ", nil) - } - orgApp := orgApps[appId] - - return Json(200, dtos.NewAppSettingsDto(pluginDef, orgApp)) - } -} - -func UpdateAppSettings(c *middleware.Context, cmd m.UpdateAppSettingsCmd) Response { - appId := c.Params(":appId") - - cmd.OrgId = c.OrgId - cmd.AppId = appId - - if _, ok := plugins.Apps[cmd.AppId]; !ok { - return ApiError(404, "App type not installed.", nil) - } - - err := bus.Dispatch(&cmd) - if err != nil { - return ApiError(500, "Failed to update App Plugin", err) - } - - return ApiSuccess("App updated") -} diff --git a/pkg/api/dtos/apps.go b/pkg/api/dtos/plugins.go similarity index 67% rename from pkg/api/dtos/apps.go rename to pkg/api/dtos/plugins.go index ba26e3eb617..3692b4b2667 100644 --- a/pkg/api/dtos/apps.go +++ b/pkg/api/dtos/plugins.go @@ -5,7 +5,7 @@ import ( "github.com/grafana/grafana/pkg/plugins" ) -type AppSettings struct { +type PluginSetting struct { Name string `json:"name"` AppId string `json:"appId"` Enabled bool `json:"enabled"` @@ -18,8 +18,17 @@ type AppSettings struct { JsonData map[string]interface{} `json:"jsonData"` } -func NewAppSettingsDto(def *plugins.AppPlugin, data *models.AppSettings) *AppSettings { - dto := &AppSettings{ +type PluginListItem struct { + Name string `json:"name"` + Type string `json:"type"` + PluginId string `json:"pluginId"` + Enabled bool `json:"enabled"` + Pinned bool `json:"pinned"` + Info *plugins.PluginInfo `json:"info"` +} + +func NewPluginSettingDto(def *plugins.AppPlugin, data *models.PluginSetting) *PluginSetting { + dto := &PluginSetting{ AppId: def.Id, Name: def.Name, Info: &def.Info, diff --git a/pkg/api/plugin_setting.go b/pkg/api/plugin_setting.go new file mode 100644 index 00000000000..2a2e6ba3f55 --- /dev/null +++ b/pkg/api/plugin_setting.go @@ -0,0 +1,68 @@ +package api + +import ( + "github.com/grafana/grafana/pkg/api/dtos" + "github.com/grafana/grafana/pkg/bus" + "github.com/grafana/grafana/pkg/middleware" + m "github.com/grafana/grafana/pkg/models" + "github.com/grafana/grafana/pkg/plugins" +) + +func GetPluginList(c *middleware.Context) Response { + pluginSettingsMap, err := plugins.GetPluginSettings(c.OrgId) + + if err != nil { + return ApiError(500, "Failed to get list of plugins", err) + } + + result := make([]*dtos.PluginListItem, 0) + for _, pluginDef := range plugins.Plugins { + listItem := &dtos.PluginListItem{ + PluginId: pluginDef.Id, + Name: pluginDef.Name, + Type: pluginDef.Type, + Info: &pluginDef.Info, + } + + if pluginSetting, exists := pluginSettingsMap[pluginDef.Id]; exists { + listItem.Enabled = pluginSetting.Enabled + listItem.Pinned = pluginSetting.Pinned + } + + result = append(result, listItem) + } + + return Json(200, result) +} + +func GetPluginSettingById(c *middleware.Context) Response { + pluginId := c.Params(":pluginId") + + if pluginDef, exists := plugins.Apps[pluginId]; !exists { + return ApiError(404, "PluginId not found, no installed plugin with that id", nil) + } else { + query := m.GetPluginSettingByIdQuery{PluginId: pluginId, OrgId: c.OrgId} + if err := bus.Dispatch(&query); err != nil { + return ApiError(500, "Failed to get login settings", nil) + } + + return Json(200, dtos.NewPluginSettingDto(pluginDef, query.Result)) + } +} + +func UpdatePluginSetting(c *middleware.Context, cmd m.UpdatePluginSettingCmd) Response { + pluginId := c.Params(":pluginId") + + cmd.OrgId = c.OrgId + cmd.PluginId = pluginId + + if _, ok := plugins.Apps[cmd.PluginId]; !ok { + return ApiError(404, "Plugin not installed.", nil) + } + + if err := bus.Dispatch(&cmd); err != nil { + return ApiError(500, "Failed to update plugin setting", err) + } + + return ApiSuccess("Plugin settings updated") +} diff --git a/pkg/api/pluginproxy/pluginproxy.go b/pkg/api/pluginproxy/pluginproxy.go index 55aa0c013ce..92d07988b64 100644 --- a/pkg/api/pluginproxy/pluginproxy.go +++ b/pkg/api/pluginproxy/pluginproxy.go @@ -26,7 +26,7 @@ type templateData struct { func getHeaders(route *plugins.AppPluginRoute, orgId int64, appId string) (http.Header, error) { result := http.Header{} - query := m.GetAppSettingByAppIdQuery{OrgId: orgId, AppId: appId} + query := m.GetPluginSettingByIdQuery{OrgId: orgId, PluginId: appId} if err := bus.Dispatch(&query); err != nil { return nil, err diff --git a/pkg/models/app_settings.go b/pkg/models/plugin_setting.go similarity index 71% rename from pkg/models/app_settings.go rename to pkg/models/plugin_setting.go index 6a7bbde694d..777f4599241 100644 --- a/pkg/models/app_settings.go +++ b/pkg/models/plugin_setting.go @@ -9,12 +9,12 @@ import ( ) var ( - ErrAppSettingNotFound = errors.New("AppSetting not found") + ErrPluginSettingNotFound = errors.New("Plugin setting not found") ) -type AppSettings struct { +type PluginSetting struct { Id int64 - AppId string + PluginId string OrgId int64 Enabled bool Pinned bool @@ -39,17 +39,17 @@ func (s SecureJsonData) Decrypt() map[string]string { // COMMANDS // Also acts as api DTO -type UpdateAppSettingsCmd struct { +type UpdatePluginSettingCmd struct { Enabled bool `json:"enabled"` Pinned bool `json:"pinned"` JsonData map[string]interface{} `json:"jsonData"` SecureJsonData map[string]string `json:"secureJsonData"` - AppId string `json:"-"` - OrgId int64 `json:"-"` + PluginId string `json:"-"` + OrgId int64 `json:"-"` } -func (cmd *UpdateAppSettingsCmd) GetEncryptedJsonData() SecureJsonData { +func (cmd *UpdatePluginSettingCmd) GetEncryptedJsonData() SecureJsonData { encrypted := make(SecureJsonData) for key, data := range cmd.SecureJsonData { encrypted[key] = util.Encrypt([]byte(data), setting.SecretKey) @@ -59,13 +59,13 @@ func (cmd *UpdateAppSettingsCmd) GetEncryptedJsonData() SecureJsonData { // --------------------- // QUERIES -type GetAppSettingsQuery struct { +type GetPluginSettingsQuery struct { OrgId int64 - Result []*AppSettings + Result []*PluginSetting } -type GetAppSettingByAppIdQuery struct { - AppId string - OrgId int64 - Result *AppSettings +type GetPluginSettingByIdQuery struct { + PluginId string + OrgId int64 + Result *PluginSetting } diff --git a/pkg/plugins/queries.go b/pkg/plugins/queries.go index 8e628c5024e..b3cc92bf7d1 100644 --- a/pkg/plugins/queries.go +++ b/pkg/plugins/queries.go @@ -5,44 +5,40 @@ import ( m "github.com/grafana/grafana/pkg/models" ) -func GetOrgAppSettings(orgId int64) (map[string]*m.AppSettings, error) { - query := m.GetAppSettingsQuery{OrgId: orgId} +func GetPluginSettings(orgId int64) (map[string]*m.PluginSetting, error) { + query := m.GetPluginSettingsQuery{OrgId: orgId} if err := bus.Dispatch(&query); err != nil { return nil, err } - orgAppsMap := make(map[string]*m.AppSettings) - for _, orgApp := range query.Result { - orgAppsMap[orgApp.AppId] = orgApp + pluginMap := make(map[string]*m.PluginSetting) + for _, plug := range query.Result { + pluginMap[plug.PluginId] = plug } - return orgAppsMap, nil + return pluginMap, nil } func GetEnabledPlugins(orgId int64) (*EnabledPlugins, error) { enabledPlugins := NewEnabledPlugins() - orgApps, err := GetOrgAppSettings(orgId) + orgPlugins, err := GetPluginSettings(orgId) if err != nil { return nil, err } enabledApps := make(map[string]bool) - for appId, installedApp := range Apps { - var app AppPlugin - app = *installedApp + for pluginId, app := range Apps { - // check if the app is stored in the DB for this org and if so, use the - // state stored there. - if b, ok := orgApps[appId]; ok { + if b, ok := orgPlugins[pluginId]; ok { app.Enabled = b.Enabled app.Pinned = b.Pinned } if app.Enabled { - enabledApps[app.Id] = true - enabledPlugins.Apps = append(enabledPlugins.Apps, &app) + enabledApps[pluginId] = true + enabledPlugins.Apps = append(enabledPlugins.Apps, app) } } diff --git a/pkg/services/sqlstore/app_settings.go b/pkg/services/sqlstore/app_settings.go deleted file mode 100644 index e7d8a90a495..00000000000 --- a/pkg/services/sqlstore/app_settings.go +++ /dev/null @@ -1,70 +0,0 @@ -package sqlstore - -import ( - "time" - - "github.com/grafana/grafana/pkg/bus" - m "github.com/grafana/grafana/pkg/models" - "github.com/grafana/grafana/pkg/setting" - "github.com/grafana/grafana/pkg/util" -) - -func init() { - bus.AddHandler("sql", GetAppSettings) - bus.AddHandler("sql", GetAppSettingByAppId) - bus.AddHandler("sql", UpdateAppSettings) -} - -func GetAppSettings(query *m.GetAppSettingsQuery) error { - sess := x.Where("org_id=?", query.OrgId) - - query.Result = make([]*m.AppSettings, 0) - return sess.Find(&query.Result) -} - -func GetAppSettingByAppId(query *m.GetAppSettingByAppIdQuery) error { - appSetting := m.AppSettings{OrgId: query.OrgId, AppId: query.AppId} - has, err := x.Get(&appSetting) - if err != nil { - return err - } else if has == false { - return m.ErrAppSettingNotFound - } - query.Result = &appSetting - return nil -} - -func UpdateAppSettings(cmd *m.UpdateAppSettingsCmd) error { - return inTransaction2(func(sess *session) error { - var app m.AppSettings - - exists, err := sess.Where("org_id=? and app_id=?", cmd.OrgId, cmd.AppId).Get(&app) - sess.UseBool("enabled") - sess.UseBool("pinned") - if !exists { - app = m.AppSettings{ - AppId: cmd.AppId, - OrgId: cmd.OrgId, - Enabled: cmd.Enabled, - Pinned: cmd.Pinned, - JsonData: cmd.JsonData, - SecureJsonData: cmd.GetEncryptedJsonData(), - Created: time.Now(), - Updated: time.Now(), - } - _, err = sess.Insert(&app) - return err - } else { - for key, data := range cmd.SecureJsonData { - app.SecureJsonData[key] = util.Encrypt([]byte(data), setting.SecretKey) - } - app.SecureJsonData = cmd.GetEncryptedJsonData() - app.Updated = time.Now() - app.Enabled = cmd.Enabled - app.JsonData = cmd.JsonData - app.Pinned = cmd.Pinned - _, err = sess.Id(app.Id).Update(&app) - return err - } - }) -} diff --git a/pkg/services/sqlstore/migrations/app_settings.go b/pkg/services/sqlstore/migrations/plugin_setting.go similarity index 63% rename from pkg/services/sqlstore/migrations/app_settings.go rename to pkg/services/sqlstore/migrations/plugin_setting.go index 885dbbf9f05..4a8729691d3 100644 --- a/pkg/services/sqlstore/migrations/app_settings.go +++ b/pkg/services/sqlstore/migrations/plugin_setting.go @@ -4,12 +4,12 @@ import . "github.com/grafana/grafana/pkg/services/sqlstore/migrator" func addAppSettingsMigration(mg *Migrator) { - appSettingsV2 := Table{ - Name: "app_settings", + pluginSettingTable := Table{ + Name: "plugin_setting", Columns: []*Column{ {Name: "id", Type: DB_BigInt, IsPrimaryKey: true, IsAutoIncrement: true}, {Name: "org_id", Type: DB_BigInt, Nullable: true}, - {Name: "app_id", Type: DB_NVarchar, Length: 255, Nullable: false}, + {Name: "plugin_id", Type: DB_NVarchar, Length: 255, Nullable: false}, {Name: "enabled", Type: DB_Bool, Nullable: false}, {Name: "pinned", Type: DB_Bool, Nullable: false}, {Name: "json_data", Type: DB_Text, Nullable: true}, @@ -18,14 +18,12 @@ func addAppSettingsMigration(mg *Migrator) { {Name: "updated", Type: DB_DateTime, Nullable: false}, }, Indices: []*Index{ - {Cols: []string{"org_id", "app_id"}, Type: UniqueIndex}, + {Cols: []string{"org_id", "plugin_id"}, Type: UniqueIndex}, }, } - mg.AddMigration("Drop old table app_settings v1", NewDropTableMigration("app_settings")) - - mg.AddMigration("create app_settings table v2", NewAddTableMigration(appSettingsV2)) + mg.AddMigration("create plugin_setting table", NewAddTableMigration(pluginSettingTable)) //------- indexes ------------------ - addTableIndicesMigrations(mg, "v3", appSettingsV2) + addTableIndicesMigrations(mg, "v1", pluginSettingTable) } diff --git a/pkg/services/sqlstore/plugin_setting.go b/pkg/services/sqlstore/plugin_setting.go new file mode 100644 index 00000000000..53f4857d9b6 --- /dev/null +++ b/pkg/services/sqlstore/plugin_setting.go @@ -0,0 +1,70 @@ +package sqlstore + +import ( + "time" + + "github.com/grafana/grafana/pkg/bus" + m "github.com/grafana/grafana/pkg/models" + "github.com/grafana/grafana/pkg/setting" + "github.com/grafana/grafana/pkg/util" +) + +func init() { + bus.AddHandler("sql", GetPluginSettings) + bus.AddHandler("sql", GetPluginSettingById) + bus.AddHandler("sql", UpdatePluginSetting) +} + +func GetPluginSettings(query *m.GetPluginSettingsQuery) error { + sess := x.Where("org_id=?", query.OrgId) + + query.Result = make([]*m.PluginSetting, 0) + return sess.Find(&query.Result) +} + +func GetPluginSettingById(query *m.GetPluginSettingByIdQuery) error { + pluginSetting := m.PluginSetting{OrgId: query.OrgId, PluginId: query.PluginId} + has, err := x.Get(&pluginSetting) + if err != nil { + return err + } else if has == false { + return m.ErrPluginSettingNotFound + } + query.Result = &pluginSetting + return nil +} + +func UpdatePluginSetting(cmd *m.UpdatePluginSettingCmd) error { + return inTransaction2(func(sess *session) error { + var pluginSetting m.PluginSetting + + exists, err := sess.Where("org_id=? and plugin_id=?", cmd.OrgId, cmd.PluginId).Get(&pluginSetting) + sess.UseBool("enabled") + sess.UseBool("pinned") + if !exists { + pluginSetting = m.PluginSetting{ + PluginId: cmd.PluginId, + OrgId: cmd.OrgId, + Enabled: cmd.Enabled, + Pinned: cmd.Pinned, + JsonData: cmd.JsonData, + SecureJsonData: cmd.GetEncryptedJsonData(), + Created: time.Now(), + Updated: time.Now(), + } + _, err = sess.Insert(&pluginSetting) + return err + } else { + for key, data := range cmd.SecureJsonData { + pluginSetting.SecureJsonData[key] = util.Encrypt([]byte(data), setting.SecretKey) + } + pluginSetting.SecureJsonData = cmd.GetEncryptedJsonData() + pluginSetting.Updated = time.Now() + pluginSetting.Enabled = cmd.Enabled + pluginSetting.JsonData = cmd.JsonData + pluginSetting.Pinned = cmd.Pinned + _, err = sess.Id(pluginSetting.Id).Update(&pluginSetting) + return err + } + }) +} diff --git a/public/app/core/routes/routes.ts b/public/app/core/routes/routes.ts index 604dc9f9876..6e3af683c82 100644 --- a/public/app/core/routes/routes.ts +++ b/public/app/core/routes/routes.ts @@ -11,7 +11,7 @@ function setupAngularRoutes($routeProvider, $locationProvider) { $locationProvider.html5Mode(true); var loadOrgBundle = new BundleLoader('app/features/org/all'); - var loadAppsBundle = new BundleLoader('app/features/apps/all'); + var loadPluginsBundle = new BundleLoader('app/features/plugins/all'); var loadAdminBundle = new BundleLoader('app/features/admin/admin'); $routeProvider @@ -165,23 +165,23 @@ function setupAngularRoutes($routeProvider, $locationProvider) { controller : 'SnapshotsCtrl', controllerAs: 'ctrl', }) - .when('/apps', { - templateUrl: 'public/app/features/apps/partials/list.html', - controller: 'AppListCtrl', + .when('/plugins', { + templateUrl: 'public/app/features/plugins/partials/list.html', + controller: 'PluginListCtrl', controllerAs: 'ctrl', - resolve: loadAppsBundle, + resolve: loadPluginsBundle, }) - .when('/apps/:appId/edit', { - templateUrl: 'public/app/features/apps/partials/edit.html', - controller: 'AppEditCtrl', + .when('/plugins/:pluginId/edit', { + templateUrl: 'public/app/features/plugins/partials/edit.html', + controller: 'PluginEditCtrl', controllerAs: 'ctrl', - resolve: loadAppsBundle, + resolve: loadPluginsBundle, }) - .when('/apps/:appId/page/:slug', { - templateUrl: 'public/app/features/apps/partials/page.html', + .when('/plugins/:pluginId/page/:slug', { + templateUrl: 'public/app/features/plugins/partials/page.html', controller: 'AppPageCtrl', controllerAs: 'ctrl', - resolve: loadAppsBundle, + resolve: loadPluginsBundle, }) .when('/global-alerts', { templateUrl: 'public/app/features/dashboard/partials/globalAlerts.html', diff --git a/public/app/features/apps/edit_ctrl.ts b/public/app/features/apps/edit_ctrl.ts deleted file mode 100644 index 1cb4dd269ef..00000000000 --- a/public/app/features/apps/edit_ctrl.ts +++ /dev/null @@ -1,49 +0,0 @@ -/// - -import angular from 'angular'; -import _ from 'lodash'; - -export class AppEditCtrl { - appModel: any; - appId: any; - includedPanels: any; - includedDatasources: any; - - /** @ngInject */ - constructor(private backendSrv: any, private $routeParams: any) { - this.appModel = {}; - this.appId = $routeParams.appId; - - this.backendSrv.get(`/api/org/apps/${this.appId}/settings`).then(result => { - this.appModel = result; - this.includedPanels = _.where(result.includes, {type: 'panel'}); - this.includedDatasources = _.where(result.includes, {type: 'datasource'}); - }); - } - - update() { - var updateCmd = _.extend({ - appId: this.appModel.appId, - orgId: this.appModel.orgId, - enabled: this.appModel.enabled, - pinned: this.appModel.pinned, - jsonData: this.appModel.jsonData, - secureJsonData: this.appModel.secureJsonData, - }, {}); - - this.backendSrv.post(`/api/org/apps/${this.appId}/settings`, updateCmd).then(function() { - window.location.href = window.location.href; - }); - } - - toggleEnabled() { - this.update(); - } - - togglePinned() { - this.update(); - } -} - -angular.module('grafana.controllers').controller('AppEditCtrl', AppEditCtrl); - diff --git a/public/app/features/apps/list_ctrl.ts b/public/app/features/apps/list_ctrl.ts deleted file mode 100644 index 8777f206d88..00000000000 --- a/public/app/features/apps/list_ctrl.ts +++ /dev/null @@ -1,17 +0,0 @@ -/// - -import angular from 'angular'; - -export class AppListCtrl { - apps: any[]; - - /** @ngInject */ - constructor(private backendSrv: any) { - - this.backendSrv.get('api/org/apps').then(apps => { - this.apps = apps; - }); - } -} - -angular.module('grafana.controllers').controller('AppListCtrl', AppListCtrl); diff --git a/public/app/features/apps/partials/list.html b/public/app/features/apps/partials/list.html deleted file mode 100644 index bb39e6c6504..00000000000 --- a/public/app/features/apps/partials/list.html +++ /dev/null @@ -1,47 +0,0 @@ - - - -
- -
- No apps defined -
- -
    -
  • - -
  • -
-
diff --git a/public/app/features/apps/all.ts b/public/app/features/plugins/all.ts similarity index 100% rename from public/app/features/apps/all.ts rename to public/app/features/plugins/all.ts diff --git a/public/app/features/plugins/edit_ctrl.ts b/public/app/features/plugins/edit_ctrl.ts new file mode 100644 index 00000000000..38ecc04906e --- /dev/null +++ b/public/app/features/plugins/edit_ctrl.ts @@ -0,0 +1,49 @@ +/// + +import angular from 'angular'; +import _ from 'lodash'; + +export class PluginEditCtrl { + model: any; + pluginId: any; + includedPanels: any; + includedDatasources: any; + + /** @ngInject */ + constructor(private backendSrv: any, private $routeParams: any) { + this.model = {}; + this.pluginId = $routeParams.pluginId; + + this.backendSrv.get(`/api/org/plugins/${this.pluginId}/settings`).then(result => { + this.model = result; + this.includedPanels = _.where(result.includes, {type: 'panel'}); + this.includedDatasources = _.where(result.includes, {type: 'datasource'}); + }); + } + + update() { + var updateCmd = _.extend({ + pluginId: this.model.pluginId, + orgId: this.model.orgId, + enabled: this.model.enabled, + pinned: this.model.pinned, + jsonData: this.model.jsonData, + secureJsonData: this.model.secureJsonData, + }, {}); + + this.backendSrv.post(`/api/org/plugins/${this.pluginId}/settings`, updateCmd).then(function() { + window.location.href = window.location.href; + }); + } + + toggleEnabled() { + this.update(); + } + + togglePinned() { + this.update(); + } +} + +angular.module('grafana.controllers').controller('PluginEditCtrl', PluginEditCtrl); + diff --git a/public/app/features/plugins/list_ctrl.ts b/public/app/features/plugins/list_ctrl.ts new file mode 100644 index 00000000000..a1bacc09c14 --- /dev/null +++ b/public/app/features/plugins/list_ctrl.ts @@ -0,0 +1,17 @@ +/// + +import angular from 'angular'; + +export class PluginListCtrl { + plugins: any[]; + + /** @ngInject */ + constructor(private backendSrv: any) { + + this.backendSrv.get('api/org/plugins').then(plugins => { + this.plugins = plugins; + }); + } +} + +angular.module('grafana.controllers').controller('PluginListCtrl', PluginListCtrl); diff --git a/public/app/features/apps/page_ctrl.ts b/public/app/features/plugins/page_ctrl.ts similarity index 100% rename from public/app/features/apps/page_ctrl.ts rename to public/app/features/plugins/page_ctrl.ts diff --git a/public/app/features/apps/partials/edit.html b/public/app/features/plugins/partials/edit.html similarity index 100% rename from public/app/features/apps/partials/edit.html rename to public/app/features/plugins/partials/edit.html diff --git a/public/app/features/plugins/partials/list.html b/public/app/features/plugins/partials/list.html new file mode 100644 index 00000000000..2b2f9741be0 --- /dev/null +++ b/public/app/features/plugins/partials/list.html @@ -0,0 +1,42 @@ + + + +
+ + + + + + + + + + + + + + + + + + + +
NameType
+ + {{plugin.name}} + + + {{plugin.type}} + + Enabled + Pinned + + + + Edit + +
+
+ diff --git a/public/app/features/apps/partials/page.html b/public/app/features/plugins/partials/page.html similarity index 100% rename from public/app/features/apps/partials/page.html rename to public/app/features/plugins/partials/page.html