-
diff --git a/src/app/routes/p_all.js b/src/app/routes/p_all.js
index 185563c1592..a5799d5108f 100644
--- a/src/app/routes/p_all.js
+++ b/src/app/routes/p_all.js
@@ -1,6 +1,6 @@
define([
'./p_dashboard',
- './p_solo-panel',
+ './pro/solo-panel',
'./p_admin',
'./p_login',
],
diff --git a/src/app/routes/p_solo-panel.js b/src/app/routes/pro/solo-panel.js
similarity index 64%
rename from src/app/routes/p_solo-panel.js
rename to src/app/routes/pro/solo-panel.js
index 6f766e31698..b2b2603c7aa 100644
--- a/src/app/routes/p_solo-panel.js
+++ b/src/app/routes/pro/solo-panel.js
@@ -14,17 +14,20 @@ function (angular) {
});
});
- module.controller('SoloPanelCtrl', function($scope, $rootScope, datasourceSrv, $routeParams, alertSrv, dashboardSrv, filterSrv) {
+ module.controller('SoloPanelCtrl', function($scope, $rootScope, datasourceSrv, $routeParams, dashboardSrv, timeSrv) {
+ var panelId;
- var db = datasourceSrv.getGrafanaDB();
- var panelId = parseInt($routeParams.panelId);
+ $scope.init = function() {
+ var db = datasourceSrv.getGrafanaDB();
+ panelId = parseInt($routeParams.panelId);
- db.getDashboard($routeParams.id, false)
- .then(function(dashboardData) {
- $scope.initPanelScope(dashboardData);
- }).then(null, function(error) {
- alertSrv.set('Error', error, 'error');
- });
+ db.getDashboard($routeParams.id, false)
+ .then(function(dashboardData) {
+ $scope.initPanelScope(dashboardData);
+ }).then(null, function(error) {
+ $scope.appEvent('alert-error', ['Load panel error', error]);
+ });
+ };
$scope.initPanelScope = function(dashboardData) {
$scope.dashboard = dashboardSrv.create(dashboardData);
@@ -36,14 +39,18 @@ function (angular) {
$scope.$index = 0;
$scope.panel = $scope.getPanelById(panelId);
+ if (!$scope.panel) {
+ $scope.appEvent('alert-error', ['Panel not found', '']);
+ return;
+ }
+
$scope.panel.span = 12;
$scope.dashboardViewState = {
registerPanel: function() {
}
};
- $scope.filter = filterSrv;
- $scope.filter.init($scope.dashboard);
+ timeSrv.init($scope.dashboard);
};
$scope.getPanelById = function(id) {
@@ -60,6 +67,10 @@ function (angular) {
return null;
};
+ if (!$scope.skipAutoInit) {
+ $scope.init();
+ }
+
});
});
diff --git a/src/test/specs/SoloPanelCtrl-specs.js b/src/test/specs/SoloPanelCtrl-specs.js
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/src/test/specs/helpers.js b/src/test/specs/helpers.js
index 1859bfc10a1..5a3213184a9 100644
--- a/src/test/specs/helpers.js
+++ b/src/test/specs/helpers.js
@@ -24,7 +24,7 @@ define([
$provide.value('timeSrv', self.timeSrv);
$provide.value('templateSrv', self.templateSrv);
$provide.value('$element', self.$element);
- _.each(mocks, function(key, value) {
+ _.each(mocks, function(value, key) {
$provide.value(key, value);
});
});
@@ -34,16 +34,20 @@ define([
return inject(function($controller, $rootScope, $q, $location) {
self.scope = $rootScope.$new();
self.$location = $location;
+ self.scope.grafana = {};
self.scope.panel = {};
self.scope.row = { panels:[] };
self.scope.dashboard = {};
self.scope.dashboardViewState = new DashboardViewStateStub();
+ self.scope.appEvent = sinon.spy();
+ self.scope.onAppEvent = sinon.spy();
$rootScope.colors = [];
for (var i = 0; i < 50; i++) { $rootScope.colors.push('#' + i); }
self.$q = $q;
self.scope.skipDataOnInit = true;
+ self.scope.skipAutoInit = true;
self.controller = $controller(controllerName, {
$scope: self.scope
});
@@ -87,6 +91,7 @@ define([
}
function TimeSrvStub() {
+ this.init = sinon.spy();
this.time = { from:'now-1h', to: 'now'};
this.timeRange = function(parse) {
if (parse === false) {
diff --git a/src/test/specs/pro/soloPanelCtrl-specs.js b/src/test/specs/pro/soloPanelCtrl-specs.js
new file mode 100644
index 00000000000..aa0ef4de31a
--- /dev/null
+++ b/src/test/specs/pro/soloPanelCtrl-specs.js
@@ -0,0 +1,57 @@
+define([
+ '../helpers',
+ 'routes/pro/solo-panel',
+ 'services/dashboard/dashboardSrv',
+], function(helpers) {
+ 'use strict';
+
+ describe('SoloPanelCtrl', function() {
+ var ctx = new helpers.ControllerTestContext();
+ var datasource = {};
+ var routeParams = {};
+
+ beforeEach(module('grafana.routes'));
+ beforeEach(module('grafana.services'));
+ beforeEach(ctx.providePhase({
+ $routeParams: routeParams,
+ datasourceSrv: {
+ getGrafanaDB: sinon.stub().returns(datasource)
+ }
+ }));
+
+ beforeEach(ctx.createControllerPhase('SoloPanelCtrl'));
+
+ describe('setting up solo panel scope', function() {
+
+ beforeEach(function() {
+ var dashboard = {
+ rows: [
+ {
+ panels: [
+ {
+ id: 23,
+ some: 'prop'
+ }
+ ]
+ }
+ ]
+ };
+
+ routeParams.id = 1;
+ routeParams.panelId = 23;
+ datasource.getDashboard = sinon.stub().returns(ctx.$q.when(dashboard));
+
+ ctx.scope.init();
+ ctx.scope.$digest();
+ });
+
+ it('should load dashboard and extract panel and setup panel scope', function() {
+ expect(ctx.scope.panel.id).to.be(23);
+ expect(ctx.scope.panel.some).to.be('prop');
+ });
+
+ });
+
+ });
+
+});
diff --git a/src/test/test-main.js b/src/test/test-main.js
index 89228f9e04b..b642063e598 100644
--- a/src/test/test-main.js
+++ b/src/test/test-main.js
@@ -114,6 +114,7 @@ require([
angular.module('grafana', ['ngRoute']);
angular.module('grafana.services', ['ngRoute', '$strap.directives']);
angular.module('grafana.panels', []);
+ angular.module('grafana.routes', ['ngRoute']);
angular.module('grafana.filters', []);
require([
@@ -140,6 +141,7 @@ require([
'specs/dashboardSrv-specs',
'specs/dashboardViewStateSrv-specs',
'specs/overview-ctrl-specs',
+ 'specs/pro/soloPanelCtrl-specs',
], function () {
window.__karma__.start();
});