diff --git a/src/app/controllers/dash.js b/src/app/controllers/dash.js index 492c86fa3f5..3706a0a4109 100644 --- a/src/app/controllers/dash.js +++ b/src/app/controllers/dash.js @@ -10,7 +10,10 @@ function (angular, $, config, _) { var module = angular.module('grafana.controllers'); - module.controller('DashCtrl', function($scope, $rootScope, dashboardKeybindings, filterSrv, dashboardSrv, panelMoveSrv, timer) { + module.controller('DashCtrl', function( + $scope, $rootScope, dashboardKeybindings, + filterSrv, dashboardSrv, dashboardViewStateSrv, + panelMoveSrv, timer) { $scope.editor = { index: 0 }; $scope.panelNames = config.panels; @@ -24,7 +27,7 @@ function (angular, $, config, _) { timer.cancel_all(); $scope.dashboard = dashboardSrv.create(dashboardData); - $scope.dashboardViewState = dashboardSrv.createViewState(); + $scope.dashboardViewState = dashboardViewStateSrv.create($scope); $scope.grafana.style = $scope.dashboard.style; diff --git a/src/app/services/all.js b/src/app/services/all.js index a1479355def..62deab62e5e 100644 --- a/src/app/services/all.js +++ b/src/app/services/all.js @@ -11,5 +11,6 @@ define([ './unsavedChangesSrv', './dashboard/dashboardKeyBindings', './dashboard/dashboardSrv', + './dashboard/dashboardViewStateSrv', ], function () {}); diff --git a/src/app/services/dashboard/dashboardSrv.js b/src/app/services/dashboard/dashboardSrv.js index 26c1c3b8f5b..b136d7a61c5 100644 --- a/src/app/services/dashboard/dashboardSrv.js +++ b/src/app/services/dashboard/dashboardSrv.js @@ -150,35 +150,9 @@ function (angular, $, kbn, _) { this.version = 3; }; - // represents the transient view state - // like fullscreen panel & edit - function DashboardViewState() { - var queryParams = $location.search(); - this.update({ - panelId: parseInt(queryParams.panelId), - fullscreen: queryParams.fullscreen ? true : false, - edit: queryParams.edit ? true : false - }); - } - - DashboardViewState.prototype.update = function(state) { - _.extend(this, state); - if (!this.fullscreen) { - delete this.fullscreen; - delete this.panelId; - delete this.edit; - } - if (!this.edit) { delete this.edit; } - - $location.search(this); - }; - return { create: function(dashboard) { return new DashboardModel(dashboard); - }, - createViewState: function(state) { - return new DashboardViewState(state); } }; diff --git a/src/app/services/dashboard/dashboardViewStateSrv.js b/src/app/services/dashboard/dashboardViewStateSrv.js new file mode 100644 index 00000000000..5c917af31bf --- /dev/null +++ b/src/app/services/dashboard/dashboardViewStateSrv.js @@ -0,0 +1,66 @@ +define([ + 'angular', + 'lodash', +], +function (angular, _) { + 'use strict'; + + var module = angular.module('grafana.services'); + + module.factory('dashboardViewStateSrv', function($location, $route) { + + // represents the transient view state + // like fullscreen panel & edit + function DashboardViewState($scope) { + var self = this; + + $scope.onAppEvent('$routeUpdate', function() { + var current = $route.current.params; + console.log('Route updated', current); + if (self.fullscreen && !current.fullscreen) { + console.log('emit panel exit'); + $scope.emitAppEvent('panel-fullscreen-exit'); + } + if (!self.fullscreen && current.fullscreen) { + $scope.emitAppEvent('dashboard-view-state-mismatch', current); + } + }); + + this.panelScopes = []; + + var queryParams = $location.search(); + this.update({ + panelId: parseInt(queryParams.panelId), + fullscreen: queryParams.fullscreen ? true : false, + edit: queryParams.edit ? true : false + }); + } + + DashboardViewState.prototype.update = function(state) { + _.extend(this, state); + if (!this.fullscreen) { + delete this.fullscreen; + delete this.panelId; + delete this.edit; + } + if (!this.edit) { delete this.edit; } + + $location.search(this); + }; + + DashboardViewState.prototype.test = function() { + + }; + + DashboardViewState.prototype.registerPanel = function(panelScope) { + this.panelScopes.push(panelScope); + }; + + return { + create: function($scope) { + return new DashboardViewState($scope); + } + }; + + }); +}); diff --git a/src/app/services/panelSrv.js b/src/app/services/panelSrv.js index 8ea70df999f..0a161df4753 100644 --- a/src/app/services/panelSrv.js +++ b/src/app/services/panelSrv.js @@ -167,6 +167,7 @@ function (angular, _, $) { $scope.datasources = datasourceSrv.getMetricSources(); $scope.setDatasource($scope.panel.datasource); + $scope.dashboardViewState.registerPanel($scope); if ($scope.dashboardViewState.panelId === $scope.panel.id) { $scope.enterFullscreenMode({edit: $scope.dashboardViewState.edit}); } diff --git a/src/test/specs/dashboardSrv-specs.js b/src/test/specs/dashboardSrv-specs.js index 51bf2104f75..5b3684ec02a 100644 --- a/src/test/specs/dashboardSrv-specs.js +++ b/src/test/specs/dashboardSrv-specs.js @@ -101,7 +101,6 @@ define([ it('should remove params from query string', function() { viewState.update({fullscreen: true, panelId: 1, edit: true}); viewState.update({fullscreen: false}); - expect(location.search()).to.eql({}); expect(viewState).to.eql({}); });