diff --git a/pkg/api/dtos/plugins.go b/pkg/api/dtos/plugins.go index 7008c939aef..88683155006 100644 --- a/pkg/api/dtos/plugins.go +++ b/pkg/api/dtos/plugins.go @@ -26,6 +26,20 @@ type PluginListItem struct { Info *plugins.PluginInfo `json:"info"` } +type PluginList []PluginListItem + +func (slice PluginList) Len() int { + return len(slice) +} + +func (slice PluginList) Less(i, j int) bool { + return slice[i].Name < slice[j].Name +} + +func (slice PluginList) Swap(i, j int) { + slice[i], slice[j] = slice[j], slice[i] +} + type ImportDashboardCommand struct { PluginId string `json:"pluginId"` Path string `json:"path"` diff --git a/pkg/api/plugins.go b/pkg/api/plugins.go index 2ee77ff0a92..56d0d99296c 100644 --- a/pkg/api/plugins.go +++ b/pkg/api/plugins.go @@ -1,6 +1,8 @@ package api import ( + "sort" + "github.com/grafana/grafana/pkg/api/dtos" "github.com/grafana/grafana/pkg/bus" "github.com/grafana/grafana/pkg/middleware" @@ -19,7 +21,7 @@ func GetPluginList(c *middleware.Context) Response { return ApiError(500, "Failed to get list of plugins", err) } - result := make([]*dtos.PluginListItem, 0) + result := make(dtos.PluginList, 0) for _, pluginDef := range plugins.Plugins { // filter out app sub plugins if embeddedFilter == "0" && pluginDef.IncludedInAppId != "" { @@ -31,7 +33,7 @@ func GetPluginList(c *middleware.Context) Response { continue } - listItem := &dtos.PluginListItem{ + listItem := dtos.PluginListItem{ Id: pluginDef.Id, Name: pluginDef.Name, Type: pluginDef.Type, @@ -58,6 +60,7 @@ func GetPluginList(c *middleware.Context) Response { result = append(result, listItem) } + sort.Sort(result) return Json(200, result) } diff --git a/public/sass/components/_cards.scss b/public/sass/components/_cards.scss index 4e5b43f60f5..8272de2fa3b 100644 --- a/public/sass/components/_cards.scss +++ b/public/sass/components/_cards.scss @@ -76,6 +76,8 @@ .card-item-figure { margin: 0 $spacer $spacer 0; + height: 6rem; + img { width: 6rem; }