grafana/src/app/services/unsavedChangesSrv.js

119 lines
2.9 KiB
JavaScript
Raw Normal View History

2014-04-25 08:23:17 -05:00
define([
'angular',
'underscore',
'config',
2014-04-25 08:23:17 -05:00
],
2014-06-06 23:38:33 -05:00
function(angular, _, config) {
2014-04-25 08:23:17 -05:00
'use strict';
if (!config.unsaved_changes_warning) {
return;
}
2014-04-25 08:23:17 -05:00
var module = angular.module('kibana.services');
2014-06-08 07:40:44 -05:00
module.service('unsavedChangesSrv', function($rootScope, $modal, $q, $location, $timeout) {
2014-04-25 08:23:17 -05:00
var self = this;
var modalScope = $rootScope.$new();
2014-06-06 23:38:33 -05:00
$rootScope.$on("dashboard-loaded", function(event, newDashboard) {
self.original = angular.copy(newDashboard);
2014-06-08 07:40:44 -05:00
self.current = newDashboard;
});
$rootScope.$on("dashboard-saved", function(event, savedDashboard) {
self.original = angular.copy(savedDashboard);
2014-06-08 07:40:44 -05:00
self.current = savedDashboard;
});
$rootScope.$on("$routeChangeSuccess", function() {
self.original = null;
});
2014-06-06 23:38:33 -05:00
window.onbeforeunload = function() {
if (self.has_unsaved_changes()) {
return "There are unsaved changes to this dashboard";
}
};
this.init = function() {
$rootScope.$on("$locationChangeStart", function(event, next) {
if (self.has_unsaved_changes()) {
event.preventDefault();
self.next = next;
self.open_modal();
}
});
};
2014-04-25 08:23:17 -05:00
2014-06-06 23:38:33 -05:00
this.open_modal = function() {
2014-04-25 08:23:17 -05:00
var confirmModal = $modal({
template: './app/partials/unsaved-changes.html',
persist: true,
show: false,
scope: modalScope,
keyboard: false
});
$q.when(confirmModal).then(function(modalEl) {
modalEl.modal('show');
});
};
2014-06-06 23:38:33 -05:00
this.has_unsaved_changes = function() {
if (!self.original) {
2014-04-25 08:23:17 -05:00
return false;
}
2014-06-08 07:40:44 -05:00
var current = angular.copy(self.current);
var original = self.original;
// ignore timespan changes
current.services.filter.time = original.services.filter.time = {};
current.refresh = original.refresh;
var currentTimepicker = _.findWhere(current.nav, { type: 'timepicker' });
var originalTimepicker = _.findWhere(original.nav, { type: 'timepicker' });
if (currentTimepicker && originalTimepicker) {
currentTimepicker.now = originalTimepicker.now;
}
2014-04-25 08:23:17 -05:00
var currentJson = angular.toJson(current);
var originalJson = angular.toJson(original);
2014-04-25 08:23:17 -05:00
if (currentJson !== originalJson) {
return true;
2014-04-25 08:23:17 -05:00
}
return false;
};
2014-06-06 23:38:33 -05:00
this.goto_next = function() {
var baseLen = $location.absUrl().length - $location.url().length;
var nextUrl = self.next.substring(baseLen);
$location.url(nextUrl);
};
modalScope.ignore = function() {
self.original = null;
self.goto_next();
};
modalScope.save = function() {
var unregister = $rootScope.$on('dashboard-saved', function() {
self.goto_next();
});
$timeout(unregister, 2000);
$rootScope.$emit('save-dashboard');
2014-04-25 08:23:17 -05:00
};
}).run(function(unsavedChangesSrv) {
unsavedChangesSrv.init();
2014-04-25 08:23:17 -05:00
});
});