From d46e612cb164085eefeee1c862dfe7dba0978307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Tue, 12 Aug 2014 18:21:48 +0200 Subject: [PATCH 1/9] Working on linking to panels, #576, #672 --- src/app/controllers/dash.js | 4 ++++ src/app/panels/graph/module.js | 18 ++------------- src/app/routes/dashboard-from-db.js | 8 ++++++- src/app/services/dashboard/dashboardSrv.js | 27 ++++++++++++++++++---- src/app/services/panelSrv.js | 23 ++++++++++++++++++ src/test/specs/dashboardSrv-specs.js | 2 +- 6 files changed, 60 insertions(+), 22 deletions(-) diff --git a/src/app/controllers/dash.js b/src/app/controllers/dash.js index e40db93fd7e..83a2a0b3b2d 100644 --- a/src/app/controllers/dash.js +++ b/src/app/controllers/dash.js @@ -49,6 +49,10 @@ function (angular, $, config, _) { dashboardKeybindings.shortcuts($scope); + if ($scope.dashboard.$state.panelId) { + $rootScope.fullscreen = true; + } + $scope.emitAppEvent("dashboard-loaded", $scope.dashboard); }; diff --git a/src/app/panels/graph/module.js b/src/app/panels/graph/module.js index 8daa773c620..3dba7c096cb 100644 --- a/src/app/panels/graph/module.js +++ b/src/app/panels/graph/module.js @@ -188,13 +188,7 @@ function (angular, app, $, _, kbn, moment, timeSeries) { _.defaults($scope.panel.grid, _d.grid); _.defaults($scope.panel.legend, _d.legend); - $scope.init = function() { - panelSrv.init($scope); - $scope.hiddenSeries = {}; - if (!$scope.skipDataOnInit) { - $scope.get_data(); - } - }; + $scope.hiddenSeries = {}; $scope.updateTimeRange = function () { $scope.range = $scope.filter.timeRange(); @@ -210,10 +204,6 @@ function (angular, app, $, _, kbn, moment, timeSeries) { }; $scope.get_data = function() { - delete $scope.panel.error; - - $scope.panelMeta.loading = true; - $scope.updateTimeRange(); var metricsQuery = { @@ -297,10 +287,6 @@ function (angular, app, $, _, kbn, moment, timeSeries) { return series; }; - $scope.otherPanelInFullscreenMode = function() { - return $rootScope.fullscreen && !$scope.fullscreen; - }; - $scope.render = function(data) { $scope.$emit('render', data); }; @@ -371,7 +357,7 @@ function (angular, app, $, _, kbn, moment, timeSeries) { $scope.render(); }; - $scope.init(); + panelSrv.init($scope); }); }); diff --git a/src/app/routes/dashboard-from-db.js b/src/app/routes/dashboard-from-db.js index a2202ef518d..3882c7ca65c 100644 --- a/src/app/routes/dashboard-from-db.js +++ b/src/app/routes/dashboard-from-db.js @@ -8,7 +8,7 @@ function (angular) { module.config(function($routeProvider) { $routeProvider - .when('/dashboard/db/:id', { + .when('/dashboard/db/:id/:panelId?', { templateUrl: 'app/partials/dashboard.html', controller : 'DashFromDBProvider', }) @@ -29,7 +29,13 @@ function (angular) { db.getDashboard($routeParams.id, isTemp) .then(function(dashboard) { + + dashboard.$state = { + panelId: parseInt($routeParams.panelId) + }; + $scope.emitAppEvent('setup-dashboard', dashboard); + }).then(null, function(error) { alertSrv.set('Error', error, 'error'); }); diff --git a/src/app/services/dashboard/dashboardSrv.js b/src/app/services/dashboard/dashboardSrv.js index 002f19cca15..865946ea86b 100644 --- a/src/app/services/dashboard/dashboardSrv.js +++ b/src/app/services/dashboard/dashboardSrv.js @@ -29,6 +29,8 @@ function (angular, $, kbn, _) { this.time = data.time || { from: 'now-6h', to: 'now' }; this.templating = data.templating || { list: [] }; this.refresh = data.refresh; + this.version = data.version || 0; + this.$state = data.$state; if (this.nav.length === 0) { this.nav.push({ type: 'timepicker' }); @@ -75,12 +77,30 @@ function (angular, $, kbn, _) { p.updateSchema = function(old) { var i, j, row, panel; - var isChanged = false; + var oldVersion = this.version; + this.version = 3; - if (this.version === 2) { + if (oldVersion === 3) { return; } + // Version 3 schema changes + // ensure panel ids + var panelId = 1; + for (i = 0; i < this.rows.length; i++) { + row = this.rows[i]; + for (j = 0; j < row.panels.length; j++) { + panel = row.panels[j]; + panel.id = panelId; + panelId += 1; + } + } + + if (oldVersion === 2) { + return; + } + + // Version 2 schema changes if (old.services) { if (old.services.filter) { this.time = old.services.filter.time; @@ -95,7 +115,6 @@ function (angular, $, kbn, _) { panel = row.panels[j]; if (panel.type === 'graphite') { panel.type = 'graph'; - isChanged = true; } if (panel.type === 'graph') { @@ -128,7 +147,7 @@ function (angular, $, kbn, _) { } } - this.version = 2; + this.version = 3; }; return { diff --git a/src/app/services/panelSrv.js b/src/app/services/panelSrv.js index b5d5e8e06d0..c43cf1a89f4 100644 --- a/src/app/services/panelSrv.js +++ b/src/app/services/panelSrv.js @@ -153,6 +153,10 @@ function (angular, _, $) { $scope.enterFullscreenMode({ edit: false }); }; + $scope.otherPanelInFullscreenMode = function() { + return $rootScope.fullscreen && !$scope.fullscreen; + }; + // Post init phase $scope.fullscreen = false; $scope.editor = { index: 1 }; @@ -162,6 +166,25 @@ function (angular, _, $) { $scope.datasources = datasourceSrv.getMetricSources(); $scope.setDatasource($scope.panel.datasource); + +// if ($scope.dashboard.$state.panelId === $scope.panel.id) { +// $scope.enterFullscreenMode({edit: false}); +// } + + if ($scope.get_data) { + var panel_get_data = $scope.get_data; + $scope.get_data = function() { + if ($scope.otherPanelInFullscreenMode()) { return; } + + delete $scope.panel.error; + $scope.panelMeta.loading = true; + + panel_get_data(); + }; + if (!$scope.skipDataOnInit) { + $scope.get_data(); + } + } }; }); diff --git a/src/test/specs/dashboardSrv-specs.js b/src/test/specs/dashboardSrv-specs.js index 6a43845a7d7..c2684cfdae5 100644 --- a/src/test/specs/dashboardSrv-specs.js +++ b/src/test/specs/dashboardSrv-specs.js @@ -73,7 +73,7 @@ define([ }); it('dashboard schema version should be set to latest', function() { - expect(model.version).to.be(2); + expect(model.version).to.be(3); }); }); From ec99096d523d5c42856ecf681ea6c9317d8d8c0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Wed, 13 Aug 2014 07:47:36 +0200 Subject: [PATCH 2/9] experimenting with url and dashboard state --- src/app/controllers/dash.js | 9 +-------- src/app/routes/dashboard-from-db.js | 3 ++- src/app/services/panelSrv.js | 3 ++- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/app/controllers/dash.js b/src/app/controllers/dash.js index 83a2a0b3b2d..2ea23e46889 100644 --- a/src/app/controllers/dash.js +++ b/src/app/controllers/dash.js @@ -8,10 +8,7 @@ define([ function (angular, $, config, _) { "use strict"; - 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, panelMoveSrv, timer) { $scope.editor = { index: 0 }; $scope.panelNames = config.panels; @@ -49,10 +46,6 @@ function (angular, $, config, _) { dashboardKeybindings.shortcuts($scope); - if ($scope.dashboard.$state.panelId) { - $rootScope.fullscreen = true; - } - $scope.emitAppEvent("dashboard-loaded", $scope.dashboard); }; diff --git a/src/app/routes/dashboard-from-db.js b/src/app/routes/dashboard-from-db.js index 3882c7ca65c..d10de12939d 100644 --- a/src/app/routes/dashboard-from-db.js +++ b/src/app/routes/dashboard-from-db.js @@ -8,9 +8,10 @@ function (angular) { module.config(function($routeProvider) { $routeProvider - .when('/dashboard/db/:id/:panelId?', { + .when('/dashboard/db/:id', { templateUrl: 'app/partials/dashboard.html', controller : 'DashFromDBProvider', + reloadOnSearch: false, }) .when('/dashboard/elasticsearch/:id', { templateUrl: 'app/partials/dashboard.html', diff --git a/src/app/services/panelSrv.js b/src/app/services/panelSrv.js index c43cf1a89f4..c4d18fdd2e8 100644 --- a/src/app/services/panelSrv.js +++ b/src/app/services/panelSrv.js @@ -7,7 +7,7 @@ function (angular, _, $) { 'use strict'; var module = angular.module('grafana.services'); - module.service('panelSrv', function($rootScope, $timeout, datasourceSrv) { + module.service('panelSrv', function($rootScope, $timeout, datasourceSrv, $location) { this.init = function($scope) { if (!$scope.panel.span) { @@ -106,6 +106,7 @@ function (angular, _, $) { $rootScope.$emit('panel-fullscreen-enter'); $timeout(function() { + $location.search({panelId: $scope.panel.id, mode: $scope.editMode ? 'edit' : 'full' }); $scope.$emit('render'); }); From fc686ca6182dd255bfb93b53a42589af1dfcf7b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Wed, 13 Aug 2014 10:07:32 +0200 Subject: [PATCH 3/9] Fullscreen & edit state persisted to url is nearing completion, refactored fullscreen state management to a special dashboardViewState object, Issue #672 --- src/app/controllers/dash.js | 6 ++-- src/app/controllers/dashLoader.js | 1 + src/app/partials/dashLoader.html | 2 +- src/app/partials/dashboard.html | 2 +- src/app/routes/dashboard-from-db.js | 6 ---- .../dashboard/dashboardKeyBindings.js | 8 ++--- src/app/services/dashboard/dashboardSrv.js | 28 ++++++++++++++++- src/app/services/panelSrv.js | 15 +++++----- src/index.html | 2 +- src/test/specs/dashboardSrv-specs.js | 30 +++++++++++++++++++ src/test/specs/helpers.js | 1 + 11 files changed, 75 insertions(+), 26 deletions(-) diff --git a/src/app/controllers/dash.js b/src/app/controllers/dash.js index 2ea23e46889..492c86fa3f5 100644 --- a/src/app/controllers/dash.js +++ b/src/app/controllers/dash.js @@ -8,6 +8,8 @@ define([ function (angular, $, config, _) { "use strict"; + var module = angular.module('grafana.controllers'); + module.controller('DashCtrl', function($scope, $rootScope, dashboardKeybindings, filterSrv, dashboardSrv, panelMoveSrv, timer) { $scope.editor = { index: 0 }; @@ -21,9 +23,9 @@ function (angular, $, config, _) { $scope.setupDashboard = function(event, dashboardData) { timer.cancel_all(); - $rootScope.fullscreen = false; - $scope.dashboard = dashboardSrv.create(dashboardData); + $scope.dashboardViewState = dashboardSrv.createViewState(); + $scope.grafana.style = $scope.dashboard.style; $scope.filter = filterSrv; diff --git a/src/app/controllers/dashLoader.js b/src/app/controllers/dashLoader.js index 27071213d8f..7756151e6c9 100644 --- a/src/app/controllers/dashLoader.js +++ b/src/app/controllers/dashLoader.js @@ -14,6 +14,7 @@ function (angular, _, moment, config) { $scope.init = function() { $scope.db = datasourceSrv.getGrafanaDB(); + $scope.onAppEvent('save-dashboard', function() { $scope.saveDashboard(); }); diff --git a/src/app/partials/dashLoader.html b/src/app/partials/dashLoader.html index 4fd73b864c9..28413d32c0b 100644 --- a/src/app/partials/dashLoader.html +++ b/src/app/partials/dashLoader.html @@ -4,7 +4,7 @@ } -
  • +
  • Back to dashboard diff --git a/src/app/partials/dashboard.html b/src/app/partials/dashboard.html index 39a287489dd..013b924c77a 100644 --- a/src/app/partials/dashboard.html +++ b/src/app/partials/dashboard.html @@ -1,4 +1,4 @@ -
    +
    -
    +
    diff --git a/src/app/partials/roweditor.html b/src/app/partials/roweditor.html index 583c664a3cb..eb3bc9258a6 100644 --- a/src/app/partials/roweditor.html +++ b/src/app/partials/roweditor.html @@ -27,7 +27,7 @@ Title Type - Span ({{rowSpan(row)}}/12) + Span ({{dashboard.rowSpan(row)}}/12) Delete Move @@ -49,7 +49,7 @@

    Select Panel Type

    - + Note: This row is full, new panels will wrap to a new line. You should add another row. diff --git a/src/app/services/dashboard/dashboardSrv.js b/src/app/services/dashboard/dashboardSrv.js index 9910f1ebfe8..4f72338dbb1 100644 --- a/src/app/services/dashboard/dashboardSrv.js +++ b/src/app/services/dashboard/dashboardSrv.js @@ -49,6 +49,65 @@ function (angular, $, kbn, _) { var p = DashboardModel.prototype; + p.getNextPanelId = function() { + var i, j, row, panel, max = 0; + for (i = 0; i < this.rows.length; i++) { + row = this.rows[i]; + for (j = 0; j < row.panels.length; j++) { + panel = row.panels[j]; + if (panel.id > max) { max = panel.id; } + } + } + return max + 1; + }; + + p.rowSpan = function(row) { + return _.reduce(row.panels, function(p,v) { + return p + v.span; + },0); + }; + + p.add_panel = function(panel, row) { + var rowSpan = this.rowSpan(row); + var panelCount = row.panels.length; + var space = (12 - rowSpan) - panel.span; + panel.id = this.getNextPanelId(); + + // try to make room of there is no space left + if (space <= 0) { + if (panelCount === 1) { + row.panels[0].span = 6; + panel.span = 6; + } + else if (panelCount === 2) { + row.panels[0].span = 4; + row.panels[1].span = 4; + panel.span = 4; + } + } + + row.panels.push(panel); + }; + + p.duplicatePanel = function(panel, row) { + var rowIndex = _.indexOf(this.rows, row); + var newPanel = angular.copy(panel); + newPanel.id = this.getNextPanelId(); + + while(rowIndex < this.rows.length) { + var currentRow = this.rows[rowIndex]; + if (this.rowSpan(currentRow) <= 9) { + currentRow.panels.push(newPanel); + return; + } + rowIndex++; + } + + var newRow = angular.copy(row); + newRow.panels = [newPanel]; + this.rows.push(newRow); + }; + p.emit_refresh = function() { $rootScope.$broadcast('refresh'); }; @@ -86,13 +145,15 @@ function (angular, $, kbn, _) { // Version 3 schema changes // ensure panel ids - var panelId = 1; + var maxId = this.getNextPanelId(); for (i = 0; i < this.rows.length; i++) { row = this.rows[i]; for (j = 0; j < row.panels.length; j++) { panel = row.panels[j]; - panel.id = panelId; - panelId += 1; + if (!panel.id) { + panel.id = maxId; + maxId += 1; + } } } diff --git a/src/test/specs/dashboardSrv-specs.js b/src/test/specs/dashboardSrv-specs.js index 5b09fc1d65a..5e4e96401de 100644 --- a/src/test/specs/dashboardSrv-specs.js +++ b/src/test/specs/dashboardSrv-specs.js @@ -7,7 +7,6 @@ define([ var model; beforeEach(module('grafana.services')); - beforeEach(inject(function(dashboardSrv) { model = dashboardSrv.create({}); })); @@ -24,12 +23,71 @@ define([ }); + describe('when getting next panel id', function() { + var model; + + beforeEach(module('grafana.services')); + beforeEach(inject(function(dashboardSrv) { + model = dashboardSrv.create({ + rows: [{ panels: [{ id: 5 }]}] + }); + })); + + it('should return max id + 1', function() { + expect(model.getNextPanelId()).to.be(6); + }); + }); + + describe('row and panel manipulation', function() { + var dashboard; + + beforeEach(module('grafana.services')); + beforeEach(inject(function(dashboardSrv) { + dashboard = dashboardSrv.create({}); + })); + + it('row span should sum spans', function() { + var spanLeft = dashboard.rowSpan({ panels: [{ span: 2 }, { span: 3 }] }); + expect(spanLeft).to.be(5); + }); + + it('adding default should split span in half', function() { + dashboard.rows = [{ panels: [{ span: 12, id: 7 }] }]; + dashboard.add_panel({span: 4}, dashboard.rows[0]); + + expect(dashboard.rows[0].panels[0].span).to.be(6); + expect(dashboard.rows[0].panels[1].span).to.be(6); + expect(dashboard.rows[0].panels[1].id).to.be(8); + }); + + it('duplicate panel should try to add it to same row', function() { + var panel = { span: 4, attr: '123', id: 10 }; + dashboard.rows = [{ panels: [panel] }]; + dashboard.duplicatePanel(panel, dashboard.rows[0]); + + expect(dashboard.rows[0].panels[0].span).to.be(4); + expect(dashboard.rows[0].panels[1].span).to.be(4); + expect(dashboard.rows[0].panels[1].attr).to.be('123'); + expect(dashboard.rows[0].panels[1].id).to.be(11); + }); + + it('duplicate should add row if there is no space left', function() { + var panel = { span: 12, attr: '123' }; + dashboard.rows = [{ panels: [panel] }]; + dashboard.duplicatePanel(panel, dashboard.rows[0]); + + expect(dashboard.rows[0].panels[0].span).to.be(12); + expect(dashboard.rows[0].panels.length).to.be(1); + expect(dashboard.rows[1].panels[0].attr).to.be('123'); + }); + + }); + describe('when creating dashboard with old schema', function() { var model; var graph; beforeEach(module('grafana.services')); - beforeEach(inject(function(dashboardSrv) { model = dashboardSrv.create({ services: { filter: { time: { from: 'now-1d', to: 'now'}, list: [1] }}, diff --git a/src/test/specs/helpers.js b/src/test/specs/helpers.js index 465e5344779..cd31779cc99 100644 --- a/src/test/specs/helpers.js +++ b/src/test/specs/helpers.js @@ -26,6 +26,7 @@ define([ self.scope.panel = {}; self.scope.row = { panels:[] }; self.scope.filter = new FilterSrvStub(); + self.scope.dashboard = {}; self.scope.dashboardViewState = new DashboardViewStateStub(); $rootScope.colors = []; diff --git a/src/test/specs/row-ctrl-specs.js b/src/test/specs/row-ctrl-specs.js index de149b70fac..41543784f40 100644 --- a/src/test/specs/row-ctrl-specs.js +++ b/src/test/specs/row-ctrl-specs.js @@ -12,50 +12,6 @@ define([ beforeEach(ctx.providePhase()); beforeEach(ctx.createControllerPhase('RowCtrl')); - describe('when getting rowSpan', function() { - it('should return sum of panels spans', function() { - var spanLeft = ctx.scope.rowSpan({ panels: [{ span: 2 }, { span: 3 }] }); - expect(spanLeft).to.be(5); - }); - }); - - describe('when adding panel to row with 12 span panel', function() { - it('should split span in half and add panel with defaults', function() { - ctx.scope.row = { panels: [{ span: 12 }] }; - ctx.scope.add_panel_default('graph'); - - expect(ctx.scope.row.panels[0].span).to.be(6); - expect(ctx.scope.row.panels[1].span).to.be(6); - expect(ctx.scope.row.panels[1].type).to.be('graph'); - }); - }); - - describe('when duplicating panel', function() { - it('should try to add it to same row', function() { - var panel = { span: 4, attr: '123' }; - ctx.scope.row = { panels: [panel] }; - ctx.scope.duplicatePanel(panel, ctx.scope.row); - - expect(ctx.scope.row.panels[0].span).to.be(4); - expect(ctx.scope.row.panels[1].span).to.be(4); - expect(ctx.scope.row.panels[1].attr).to.be('123'); - }); - }); - - describe('when duplicating panel', function() { - it('should add row if there is no space left', function() { - var panel = { span: 12, attr: '123' }; - ctx.scope.row = { panels: [panel] }; - ctx.scope.dashboard = { rows: [ctx.scope.row] }; - - ctx.scope.duplicatePanel(panel, ctx.scope.row); - - expect(ctx.scope.row.panels[0].span).to.be(12); - expect(ctx.scope.row.panels.length).to.be(1); - expect(ctx.scope.dashboard.rows[1].panels[0].attr).to.be('123'); - }); - }); - }); }); From dee0e5fce7938d37859098442b83fc35fafc5556 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Wed, 13 Aug 2014 17:20:54 +0200 Subject: [PATCH 9/9] final fixes for fullscreen url state, #672 --- src/app/controllers/dashLoader.js | 1 + src/app/controllers/search.js | 1 + src/app/services/dashboard/dashboardSrv.js | 10 +++++----- src/app/services/dashboard/dashboardViewStateSrv.js | 1 + src/app/services/playlistSrv.js | 1 + src/app/services/unsavedChangesSrv.js | 7 +++++++ 6 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/app/controllers/dashLoader.js b/src/app/controllers/dashLoader.js index 1754370ae27..720c4634628 100644 --- a/src/app/controllers/dashLoader.js +++ b/src/app/controllers/dashLoader.js @@ -75,6 +75,7 @@ function (angular, _, moment, config) { .then(function(result) { alertSrv.set('Dashboard Saved', 'Dashboard has been saved as "' + result.title + '"','success', 5000); + $location.search({}); $location.path(result.url); $rootScope.$emit('dashboard-saved', $scope.dashboard); diff --git a/src/app/controllers/search.js b/src/app/controllers/search.js index 6c504e1b925..e30031a0713 100644 --- a/src/app/controllers/search.js +++ b/src/app/controllers/search.js @@ -41,6 +41,7 @@ function (angular, _, config, $) { var selectedDash = $scope.results.dashboards[$scope.selectedIndex]; if (selectedDash) { + $location.search({}); $location.path("/dashboard/db/" + selectedDash.id); setTimeout(function() { $('body').click(); // hack to force dropdown to close; diff --git a/src/app/services/dashboard/dashboardSrv.js b/src/app/services/dashboard/dashboardSrv.js index 4f72338dbb1..43c93379dd9 100644 --- a/src/app/services/dashboard/dashboardSrv.js +++ b/src/app/services/dashboard/dashboardSrv.js @@ -52,11 +52,11 @@ function (angular, $, kbn, _) { p.getNextPanelId = function() { var i, j, row, panel, max = 0; for (i = 0; i < this.rows.length; i++) { - row = this.rows[i]; - for (j = 0; j < row.panels.length; j++) { - panel = row.panels[j]; - if (panel.id > max) { max = panel.id; } - } + row = this.rows[i]; + for (j = 0; j < row.panels.length; j++) { + panel = row.panels[j]; + if (panel.id > max) { max = panel.id; } + } } return max + 1; }; diff --git a/src/app/services/dashboard/dashboardViewStateSrv.js b/src/app/services/dashboard/dashboardViewStateSrv.js index b39e159ae4c..dd7831df2d2 100644 --- a/src/app/services/dashboard/dashboardViewStateSrv.js +++ b/src/app/services/dashboard/dashboardViewStateSrv.js @@ -25,6 +25,7 @@ function (angular, _, $) { $scope.onAppEvent('$routeUpdate', function() { var urlState = self.getQueryStringState(); + console.log("route updated!"); if (self.needsSync(urlState)) { self.update(urlState, true); } diff --git a/src/app/services/playlistSrv.js b/src/app/services/playlistSrv.js index 0e9459832f6..c7cd453bfd3 100644 --- a/src/app/services/playlistSrv.js +++ b/src/app/services/playlistSrv.js @@ -68,6 +68,7 @@ function (angular, _, kbn) { timerInstance = setInterval(function() { $rootScope.$apply(function() { angular.element(window).unbind('resize'); + $location.search({}); $location.path(dashboards[index % dashboards.length].url); index++; }); diff --git a/src/app/services/unsavedChangesSrv.js b/src/app/services/unsavedChangesSrv.js index 92425ea89ca..6ec373ed837 100644 --- a/src/app/services/unsavedChangesSrv.js +++ b/src/app/services/unsavedChangesSrv.js @@ -28,10 +28,12 @@ function(angular, _, config) { $rootScope.$on("dashboard-saved", function(event, savedDashboard) { self.original = angular.copy(savedDashboard); self.current = savedDashboard; + self.orignalPath = $location.path(); }); $rootScope.$on("$routeChangeSuccess", function() { self.original = null; + self.originalPath = $location.path(); }); window.onbeforeunload = function() { @@ -42,6 +44,11 @@ function(angular, _, config) { this.init = function() { $rootScope.$on("$locationChangeStart", function(event, next) { + if (self.originalPath === $location.path()) { + console.log("skipping"); + return; + } + if (self.has_unsaved_changes()) { event.preventDefault(); self.next = next;