From 7cd663bbe819feb819bb155ad434d67130f292bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Sat, 14 May 2016 10:00:43 +0200 Subject: [PATCH] feat(import): more import work --- pkg/api/dtos/plugins.go | 6 +++- pkg/api/plugins.go | 3 +- pkg/plugins/dashboard_importer.go | 29 ++++++++-------- pkg/plugins/dashboards.go | 33 +++++++++++-------- public/app/core/components/search/search.html | 2 +- public/app/core/components/search/search.ts | 5 --- public/app/core/directives/dash_edit_link.js | 17 +++++++++- public/app/core/services/datasource_srv.js | 10 +++--- public/app/core/services/util_srv.ts | 3 +- .../app/features/dashboard/import/import.html | 2 +- .../app/features/dashboard/import/import.ts | 23 ++++++++++--- .../plugins/import_list/import_list.html | 12 +++---- .../plugins/import_list/import_list.ts | 6 ++-- 13 files changed, 92 insertions(+), 59 deletions(-) diff --git a/pkg/api/dtos/plugins.go b/pkg/api/dtos/plugins.go index fccb7c36849..70e732424ab 100644 --- a/pkg/api/dtos/plugins.go +++ b/pkg/api/dtos/plugins.go @@ -1,6 +1,9 @@ package dtos -import "github.com/grafana/grafana/pkg/plugins" +import ( + "github.com/grafana/grafana/pkg/components/simplejson" + "github.com/grafana/grafana/pkg/plugins" +) type PluginSetting struct { Name string `json:"name"` @@ -50,5 +53,6 @@ type ImportDashboardCommand struct { PluginId string `json:"pluginId"` Path string `json:"path"` Overwrite bool `json:"overwrite"` + Dashboard *simplejson.Json `json:"dashboard"` Inputs []plugins.ImportDashboardInput `json:"inputs"` } diff --git a/pkg/api/plugins.go b/pkg/api/plugins.go index 7d6d5906913..9d25b9c331e 100644 --- a/pkg/api/plugins.go +++ b/pkg/api/plugins.go @@ -168,10 +168,11 @@ func ImportDashboard(c *middleware.Context, apiCmd dtos.ImportDashboardCommand) Path: apiCmd.Path, Inputs: apiCmd.Inputs, Overwrite: apiCmd.Overwrite, + Dashboard: apiCmd.Dashboard, } if err := bus.Dispatch(&cmd); err != nil { - return ApiError(500, "Failed to install dashboard", err) + return ApiError(500, "Failed to import dashboard", err) } return Json(200, cmd.Result) diff --git a/pkg/plugins/dashboard_importer.go b/pkg/plugins/dashboard_importer.go index 4d2757b9a0e..aa489fcdaaf 100644 --- a/pkg/plugins/dashboard_importer.go +++ b/pkg/plugins/dashboard_importer.go @@ -11,6 +11,7 @@ import ( ) type ImportDashboardCommand struct { + Dashboard *simplejson.Json Path string Inputs []ImportDashboardInput Overwrite bool @@ -41,17 +42,15 @@ func init() { } func ImportDashboard(cmd *ImportDashboardCommand) error { - plugin, exists := Plugins[cmd.PluginId] - - if !exists { - return PluginNotFoundError{cmd.PluginId} - } - var dashboard *m.Dashboard var err error - if dashboard, err = loadPluginDashboard(plugin, cmd.Path); err != nil { - return err + if cmd.PluginId != "" { + if dashboard, err = loadPluginDashboard(cmd.PluginId, cmd.Path); err != nil { + return err + } + } else { + dashboard = m.NewDashboardFromJson(cmd.Dashboard) } evaluator := &DashTemplateEvaluator{ @@ -76,13 +75,13 @@ func ImportDashboard(cmd *ImportDashboardCommand) error { } cmd.Result = &PluginDashboardInfoDTO{ - PluginId: cmd.PluginId, - Title: dashboard.Title, - Path: cmd.Path, - Revision: dashboard.GetString("revision", "1.0"), - InstalledUri: "db/" + saveCmd.Result.Slug, - InstalledRevision: dashboard.GetString("revision", "1.0"), - Installed: true, + PluginId: cmd.PluginId, + Title: dashboard.Title, + Path: cmd.Path, + Revision: dashboard.Data.Get("revision").MustInt64(1), + ImportedUri: "db/" + saveCmd.Result.Slug, + ImportedRevision: dashboard.Data.Get("revision").MustInt64(1), + Imported: true, } return nil diff --git a/pkg/plugins/dashboards.go b/pkg/plugins/dashboards.go index 932196a42a9..1a160fe6632 100644 --- a/pkg/plugins/dashboards.go +++ b/pkg/plugins/dashboards.go @@ -10,14 +10,14 @@ import ( ) type PluginDashboardInfoDTO struct { - PluginId string `json:"pluginId"` - Title string `json:"title"` - Installed bool `json:"installed"` - InstalledUri string `json:"installedUri"` - InstalledRevision string `json:"installedRevision"` - Revision string `json:"revision"` - Description string `json:"description"` - Path string `json:"path"` + PluginId string `json:"pluginId"` + Title string `json:"title"` + Imported bool `json:"imported"` + ImportedUri string `json:"importedUri"` + ImportedRevision int64 `json:"importedRevision"` + Revision int64 `json:"revision"` + Description string `json:"description"` + Path string `json:"path"` } func GetPluginDashboards(orgId int64, pluginId string) ([]*PluginDashboardInfoDTO, error) { @@ -42,7 +42,12 @@ func GetPluginDashboards(orgId int64, pluginId string) ([]*PluginDashboardInfoDT return result, nil } -func loadPluginDashboard(plugin *PluginBase, path string) (*m.Dashboard, error) { +func loadPluginDashboard(pluginId, path string) (*m.Dashboard, error) { + plugin, exists := Plugins[pluginId] + + if !exists { + return nil, PluginNotFoundError{pluginId} + } dashboardFilePath := filepath.Join(plugin.PluginDir, path) reader, err := os.Open(dashboardFilePath) @@ -66,14 +71,14 @@ func getDashboardImportStatus(orgId int64, plugin *PluginBase, path string) (*Pl var dashboard *m.Dashboard var err error - if dashboard, err = loadPluginDashboard(plugin, path); err != nil { + if dashboard, err = loadPluginDashboard(plugin.Id, path); err != nil { return nil, err } res.Path = path res.PluginId = plugin.Id res.Title = dashboard.Title - res.Revision = dashboard.GetString("revision", "1.0") + res.Revision = dashboard.Data.Get("revision").MustInt64(1) query := m.GetDashboardQuery{OrgId: orgId, Slug: dashboard.Slug} @@ -82,9 +87,9 @@ func getDashboardImportStatus(orgId int64, plugin *PluginBase, path string) (*Pl return nil, err } } else { - res.Installed = true - res.InstalledUri = "db/" + query.Result.Slug - res.InstalledRevision = query.Result.GetString("revision", "1.0") + res.Imported = true + res.ImportedUri = "db/" + query.Result.Slug + res.ImportedRevision = query.Result.Data.Get("revision").MustInt64(1) } return res, nil diff --git a/public/app/core/components/search/search.html b/public/app/core/components/search/search.html index 72ff0d15f83..6344a26c886 100644 --- a/public/app/core/components/search/search.html +++ b/public/app/core/components/search/search.html @@ -67,7 +67,7 @@ Create New - + Import diff --git a/public/app/core/components/search/search.ts b/public/app/core/components/search/search.ts index 9da95278c57..a581afe3fd3 100644 --- a/public/app/core/components/search/search.ts +++ b/public/app/core/components/search/search.ts @@ -149,11 +149,6 @@ export class SearchCtrl { this.searchDashboards(); }; - import() { - appEvents.emit('show-modal', { - templateHtml: '', - }); - } } export function searchDirective() { diff --git a/public/app/core/directives/dash_edit_link.js b/public/app/core/directives/dash_edit_link.js index eb0fe453741..7486d0ada18 100644 --- a/public/app/core/directives/dash_edit_link.js +++ b/public/app/core/directives/dash_edit_link.js @@ -12,7 +12,7 @@ function ($, coreModule) { 'import': { src: '' } }; - coreModule.default.directive('dashEditorView', function($compile, $location) { + coreModule.default.directive('dashEditorView', function($compile, $location, $rootScope) { return { restrict: 'A', link: function(scope, elem) { @@ -57,6 +57,21 @@ function ($, coreModule) { } }; + if (editview === 'import') { + var modalScope = $rootScope.$new(); + modalScope.$on("$destroy", function() { + editorScope.dismiss(); + }); + + $rootScope.appEvent('show-modal', { + templateHtml: '', + scope: modalScope, + backdrop: 'static' + }); + + return; + } + var view = payload.src; if (view.indexOf('.html') > 0) { view = $('
'); diff --git a/public/app/core/services/datasource_srv.js b/public/app/core/services/datasource_srv.js index 32bc9a39725..a71b2bd3767 100644 --- a/public/app/core/services/datasource_srv.js +++ b/public/app/core/services/datasource_srv.js @@ -81,11 +81,11 @@ function (angular, _, coreModule, config) { _.each(config.datasources, function(value, key) { if (value.meta && value.meta.metrics) { - metricSources.push({ - value: key === config.defaultDatasource ? null : key, - name: key, - meta: value.meta, - }); + metricSources.push({value: key, name: key, meta: value.meta}); + + if (key === config.defaultDatasource) { + metricSources.push({value: null, name: 'default', meta: value.meta}); + } } }); diff --git a/public/app/core/services/util_srv.ts b/public/app/core/services/util_srv.ts index 538527b5fda..8ca7bf8be72 100644 --- a/public/app/core/services/util_srv.ts +++ b/public/app/core/services/util_srv.ts @@ -30,7 +30,8 @@ export class UtilSrv { persist: false, show: false, scope: options.scope, - keyboard: false + keyboard: false, + backdrop: options.backdrop }); Promise.resolve(modal).then(function(modalEl) { diff --git a/public/app/features/dashboard/import/import.html b/public/app/features/dashboard/import/import.html index 8a3a276ce53..7b60654dd50 100644 --- a/public/app/features/dashboard/import/import.html +++ b/public/app/features/dashboard/import/import.html @@ -84,7 +84,7 @@
- Cancel diff --git a/public/app/features/dashboard/import/import.ts b/public/app/features/dashboard/import/import.ts index 852a927ded8..dbf6b08c222 100644 --- a/public/app/features/dashboard/import/import.ts +++ b/public/app/features/dashboard/import/import.ts @@ -12,7 +12,6 @@ export class DashImportCtrl { parseError: string; nameExists: boolean; dash: any; - dismiss: any; inputs: any[]; inputsValid: boolean; @@ -33,6 +32,7 @@ export class DashImportCtrl { var inputModel = { name: input.name, type: input.type, + pluginId: input.pluginId, options: [] }; @@ -64,7 +64,7 @@ export class DashImportCtrl { }); } - inputOptionChanged() { + inputValueChanged() { this.inputsValid = true; for (let input of this.inputs) { if (!input.value) { @@ -86,9 +86,22 @@ export class DashImportCtrl { } saveDashboard() { - return this.backendSrv.saveDashboard(this.dash, {overwrite: true}).then(res => { - this.$location.url('dashboard/db/' + res.slug); - this.dismiss(); + var inputs = this.inputs.map(input => { + return { + name: input.name, + type: input.type, + pluginId: input.pluginId, + value: input.value + }; + }); + + return this.backendSrv.post('api/dashboards/import', { + dashboard: this.dash, + overwrite: true, + inputs: inputs + }).then(res => { + this.$location.url('dashboard/' + res.importedUri); + this.$scope.dismiss(); }); } diff --git a/public/app/features/plugins/import_list/import_list.html b/public/app/features/plugins/import_list/import_list.html index 86534f1adc7..746109970e0 100644 --- a/public/app/features/plugins/import_list/import_list.html +++ b/public/app/features/plugins/import_list/import_list.html @@ -6,27 +6,27 @@ - + {{dash.title}} - + {{dash.title}} v{{dash.revision}} -  (Imported v{{dash.installedRevision}}) +  (Imported v{{dash.importedRevision}}) - - - diff --git a/public/app/features/plugins/import_list/import_list.ts b/public/app/features/plugins/import_list/import_list.ts index 35f9fc62cad..0c5006b09ba 100644 --- a/public/app/features/plugins/import_list/import_list.ts +++ b/public/app/features/plugins/import_list/import_list.ts @@ -61,15 +61,15 @@ export class DashImportListCtrl { } return this.backendSrv.post(`/api/dashboards/import`, installCmd).then(res => { - this.$rootScope.appEvent('alert-success', ['Dashboard Installed', dash.title]); + this.$rootScope.appEvent('alert-success', ['Dashboard Imported', dash.title]); _.extend(dash, res); }); } remove(dash) { - this.backendSrv.delete('/api/dashboards/' + dash.installedUri).then(() => { + this.backendSrv.delete('/api/dashboards/' + dash.importedUri).then(() => { this.$rootScope.appEvent('alert-success', ['Dashboard Deleted', dash.title]); - dash.installed = false; + dash.imported = false; }); } }