diff --git a/pkg/api/dashboard.go b/pkg/api/dashboard.go
index 11a028cdd29..e5e4fc560e1 100644
--- a/pkg/api/dashboard.go
+++ b/pkg/api/dashboard.go
@@ -102,6 +102,13 @@ func GetDashboard(c *m.ReqContext) Response {
meta.FolderUrl = query.Result.GetUrl()
}
+ dpQuery := &m.GetProvisionedDashboardByDashboardId{DashboardId: dash.Id}
+ err = bus.Dispatch(dpQuery)
+ if dpQuery.Result != nil {
+ meta.CanEdit = true
+ meta.Provisioned = true
+ }
+
// make sure db version is in sync with json model version
dash.Data.Set("version", dash.Version)
diff --git a/pkg/api/dtos/dashboard.go b/pkg/api/dtos/dashboard.go
index e4c66aebbda..39a6dca580d 100644
--- a/pkg/api/dtos/dashboard.go
+++ b/pkg/api/dtos/dashboard.go
@@ -28,6 +28,7 @@ type DashboardMeta struct {
FolderId int64 `json:"folderId"`
FolderTitle string `json:"folderTitle"`
FolderUrl string `json:"folderUrl"`
+ Provisioned bool `json:"provisioned"`
}
type DashboardFullWithMeta struct {
diff --git a/pkg/models/dashboards.go b/pkg/models/dashboards.go
index 4b771038df6..e4f0758fc19 100644
--- a/pkg/models/dashboards.go
+++ b/pkg/models/dashboards.go
@@ -317,6 +317,12 @@ type GetDashboardSlugByIdQuery struct {
Result string
}
+type GetProvisionedDashboardByDashboardId struct {
+ DashboardId int64
+
+ Result *DashboardProvisioning
+}
+
type GetProvisionedDashboardDataQuery struct {
Name string
diff --git a/pkg/services/provisioning/dashboards/types.go b/pkg/services/provisioning/dashboards/types.go
index f742b321552..4a55351d3e4 100644
--- a/pkg/services/provisioning/dashboards/types.go
+++ b/pkg/services/provisioning/dashboards/types.go
@@ -55,9 +55,6 @@ func createDashboardJson(data *simplejson.Json, lastModified time.Time, cfg *Das
dash.OrgId = cfg.OrgId
dash.Dashboard.OrgId = cfg.OrgId
dash.Dashboard.FolderId = folderId
- if !cfg.Editable {
- dash.Dashboard.Data.Set("editable", cfg.Editable)
- }
if dash.Dashboard.Title == "" {
return nil, models.ErrDashboardTitleEmpty
diff --git a/pkg/services/sqlstore/dashboard_provisioning.go b/pkg/services/sqlstore/dashboard_provisioning.go
index 69409c3b873..99178d38f9c 100644
--- a/pkg/services/sqlstore/dashboard_provisioning.go
+++ b/pkg/services/sqlstore/dashboard_provisioning.go
@@ -8,6 +8,7 @@ import (
func init() {
bus.AddHandler("sql", GetProvisionedDashboardDataQuery)
bus.AddHandler("sql", SaveProvisionedDashboard)
+ bus.AddHandler("sql", GetProvisionedDataByDashboardId)
}
type DashboardExtras struct {
@@ -17,6 +18,18 @@ type DashboardExtras struct {
Value string
}
+func GetProvisionedDataByDashboardId(cmd *models.GetProvisionedDashboardByDashboardId) error {
+ result := &models.DashboardProvisioning{}
+
+ _, err := x.Where("dashboard_id = ?", cmd.DashboardId).Get(result)
+ if err != nil {
+ return err
+ }
+
+ cmd.Result = result
+ return nil
+}
+
func SaveProvisionedDashboard(cmd *models.SaveProvisionedDashboardCommand) error {
return inTransaction(func(sess *DBSession) error {
err := saveDashboard(sess, cmd.DashboardCmd)
diff --git a/pkg/services/sqlstore/dashboard_provisioning_test.go b/pkg/services/sqlstore/dashboard_provisioning_test.go
index b752173b67d..89b3451a3ac 100644
--- a/pkg/services/sqlstore/dashboard_provisioning_test.go
+++ b/pkg/services/sqlstore/dashboard_provisioning_test.go
@@ -50,6 +50,16 @@ func TestDashboardProvisioningTest(t *testing.T) {
So(query.Result[0].DashboardId, ShouldEqual, dashId)
So(query.Result[0].Updated, ShouldEqual, now.Unix())
})
+
+ Convey("Can query for one provisioned dashboard", func() {
+ query := &models.GetProvisionedDashboardByDashboardId{DashboardId: cmd.Result.Id}
+
+ err := GetProvisionedDataByDashboardId(query)
+ So(err, ShouldBeNil)
+
+ So(query.Result.DashboardId, ShouldEqual, cmd.Result.Id)
+ So(query.Result.Updated, ShouldEqual, now.Unix())
+ })
})
})
}
diff --git a/public/app/features/dashboard/all.ts b/public/app/features/dashboard/all.ts
index f2e2e3dcdc0..a8f491f3ddd 100644
--- a/public/app/features/dashboard/all.ts
+++ b/public/app/features/dashboard/all.ts
@@ -6,6 +6,7 @@ import './dashnav/dashnav';
import './submenu/submenu';
import './save_as_modal';
import './save_modal';
+import './save_provisioned_modal';
import './shareModalCtrl';
import './share_snapshot_ctrl';
import './dashboard_srv';
diff --git a/public/app/features/dashboard/dashboard_srv.ts b/public/app/features/dashboard/dashboard_srv.ts
index 9d766fdfc3f..3aa7ca118fb 100644
--- a/public/app/features/dashboard/dashboard_srv.ts
+++ b/public/app/features/dashboard/dashboard_srv.ts
@@ -105,6 +105,10 @@ export class DashboardSrv {
this.setCurrent(this.create(clone, this.dash.meta));
}
+ if (this.dash.meta.provisioned) {
+ return this.showDashboardProvisionedModal();
+ }
+
if (!this.dash.meta.canSave && options.makeEditable !== true) {
return Promise.resolve();
}
@@ -120,6 +124,13 @@ export class DashboardSrv {
return this.save(this.dash.getSaveModelClone(), options);
}
+ showDashboardProvisionedModal() {
+ this.$rootScope.appEvent('show-modal', {
+ templateHtml: '