diff --git a/pkg/api/dashboard_snapshot.go b/pkg/api/dashboard_snapshot.go index c4035e921d5..7af9d8b1f66 100644 --- a/pkg/api/dashboard_snapshot.go +++ b/pkg/api/dashboard_snapshot.go @@ -29,7 +29,7 @@ func CreateDashboardSnapshot(c *middleware.Context, cmd m.CreateDashboardSnapsho metrics.M_Api_Dashboard_Snapshot_Create.Inc(1) - c.JSON(200, util.DynMap{"key": cmd.Key, "url": setting.ToAbsUrl("/dashboard/snapshots")}) + c.JSON(200, util.DynMap{"key": cmd.Key, "url": setting.ToAbsUrl("/dashboard/snapshot")}) } func createExternalSnapshot(c *middleware.Context, cmd m.CreateDashboardSnapshotCommand) { diff --git a/src/app/features/dashboard/dashboardCtrl.js b/src/app/features/dashboard/dashboardCtrl.js index 8430ac18631..430363574c8 100644 --- a/src/app/features/dashboard/dashboardCtrl.js +++ b/src/app/features/dashboard/dashboardCtrl.js @@ -17,6 +17,7 @@ function (angular, $, config) { templateValuesSrv, dashboardSrv, dashboardViewStateSrv, + contextSrv, $timeout) { $scope.editor = { index: 0 }; @@ -46,7 +47,7 @@ function (angular, $, config) { templateValuesSrv.init(dashboard).then(function() { $scope.dashboard = dashboard; $scope.dashboardViewState = dashboardViewStateSrv.create($scope); - $scope.dashboardMeta = data.meta; + $scope.initDashboardMeta(data.meta, $scope.dashboard); dashboardKeybindings.shortcuts($scope); @@ -57,6 +58,32 @@ function (angular, $, config) { }); }; + $scope.initDashboardMeta = function(meta, dashboard) { + meta.canShare = true; + meta.canSave = true; + meta.canEdit = true; + meta.canStar = true; + + if (contextSrv.hasRole('Viewer')) { + meta.canSave = false; + } + + if (meta.isHome) { + meta.canShare = false; + meta.canStar = false; + meta.canSave = false; + meta.canEdit = false; + } + + if (dashboard.snapshot) { + meta.canEdit = false; + meta.canSave = false; + meta.canStar = false; + } + + $scope.dashboardMeta = meta; + }; + $scope.updateSubmenuVisibility = function() { $scope.submenuEnabled = $scope.dashboard.hasTemplateVarsOrAnnotations(); }; @@ -132,4 +159,5 @@ function (angular, $, config) { }; }); + }); diff --git a/src/app/features/dashboard/dashboardSrv.js b/src/app/features/dashboard/dashboardSrv.js index 77b19b3edd2..20f04b421d7 100644 --- a/src/app/features/dashboard/dashboardSrv.js +++ b/src/app/features/dashboard/dashboardSrv.js @@ -37,6 +37,7 @@ function (angular, $, kbn, _, moment) { this.templating = this._ensureListExist(data.templating); this.annotations = this._ensureListExist(data.annotations); this.refresh = data.refresh; + this.snapshot = data.snapshot; this.schemaVersion = data.schemaVersion || 0; this.version = data.version || 0; diff --git a/src/app/features/dashboard/sharePanelCtrl.js b/src/app/features/dashboard/sharePanelCtrl.js index c7303ab1a68..eb0a7a7a957 100644 --- a/src/app/features/dashboard/sharePanelCtrl.js +++ b/src/app/features/dashboard/sharePanelCtrl.js @@ -71,12 +71,16 @@ function (angular, _, require, config) { } }); - $scope.shareUrl = baseUrl + "?" + paramsArray.join('&'); + var queryParams = "?" + paramsArray.join('&'); + $scope.shareUrl = baseUrl + queryParams; - $scope.soloUrl = $scope.shareUrl.replace('/dashboard/db/', '/dashboard/solo/'); - $scope.iframeHtml = ''; + var soloUrl = $scope.shareUrl; + soloUrl = soloUrl.replace('/dashboard/db/', '/dashboard/solo/db/'); + soloUrl = soloUrl.replace('/dashboard/snapshot/', '/dashboard/solo/snapshot/'); - $scope.imageUrl = $scope.shareUrl.replace('/dashboard/db/', '/render/dashboard/solo/'); + $scope.iframeHtml = ''; + + $scope.imageUrl = soloUrl.replace('/dashboard/', '/render/dashboard/'); $scope.imageUrl += '&width=1000'; $scope.imageUrl += '&height=500'; }; diff --git a/src/app/features/dashboard/shareSnapshotCtrl.js b/src/app/features/dashboard/shareSnapshotCtrl.js index a3f279b9c64..5c41b0ee649 100644 --- a/src/app/features/dashboard/shareSnapshotCtrl.js +++ b/src/app/features/dashboard/shareSnapshotCtrl.js @@ -12,14 +12,17 @@ function (angular) { name: $scope.dashboard.title }; - $scope.createSnapshot = function(makePublic) { - $scope.dashboard.snapshot = true; + $scope.createSnapshot = function(external) { + $scope.dashboard.snapshot = { + timestamp: new Date() + }; + $scope.loading = true; $rootScope.$broadcast('refresh'); $timeout(function() { - $scope.saveSnapshot(makePublic); - }, 2000); + $scope.saveSnapshot(external); + }, 3000); }; $scope.saveSnapshot = function(external) { @@ -35,7 +38,7 @@ function (angular) { }); // cleanup snapshotData - $scope.dashboard.snapshot = false; + delete $scope.dashboard.snapshot; $scope.dashboard.forEachPanel(function(panel) { delete panel.snapshotData; }); @@ -47,7 +50,7 @@ function (angular) { $scope.snapshotUrl = results.url; } else { var baseUrl = $location.absUrl().replace($location.url(), ""); - $scope.snapshotUrl = baseUrl + '/dashboard/snapshots/' + results.key; + $scope.snapshotUrl = baseUrl + '/dashboard/snapshot/' + results.key; } }, function() { $scope.loading = false; diff --git a/src/app/features/panel/panelHelper.js b/src/app/features/panel/panelHelper.js index 62982f69438..442bcbac8c5 100644 --- a/src/app/features/panel/panelHelper.js +++ b/src/app/features/panel/panelHelper.js @@ -8,6 +8,7 @@ function (angular, _, kbn, $) { 'use strict'; var module = angular.module('grafana.services'); + module.service('panelHelper', function(timeSrv) { this.updateTimeRange = function(scope) { diff --git a/src/app/features/panel/soloPanelCtrl.js b/src/app/features/panel/soloPanelCtrl.js index c6a01d9ccfe..3c9a3dc34f0 100644 --- a/src/app/features/panel/soloPanelCtrl.js +++ b/src/app/features/panel/soloPanelCtrl.js @@ -26,12 +26,19 @@ function (angular, $) { var params = $location.search(); panelId = parseInt(params.panelId); - backendSrv.getDashboard($routeParams.slug) - .then(function(dashboard) { - $scope.initPanelScope(dashboard); - }).then(null, function(err) { - $scope.appEvent('alert-error', ['Load panel error', err.message]); - }); + var request; + + if ($routeParams.slug) { + request = backendSrv.getDashboard($routeParams.slug); + } else { + request = backendSrv.get('/api/snapshots/' + $routeParams.key); + } + + request.then(function(dashboard) { + $scope.initPanelScope(dashboard); + }).then(null, function(err) { + $scope.appEvent('alert-error', ['Load panel error', err.message]); + }); }; $scope.initPanelScope = function(dashboard) { diff --git a/src/app/partials/dashboard_topnav.html b/src/app/partials/dashboard_topnav.html index bf3ba635a97..aff1f0bbba7 100644 --- a/src/app/partials/dashboard_topnav.html +++ b/src/app/partials/dashboard_topnav.html @@ -18,19 +18,19 @@ -