diff --git a/web/pgadmin/browser/templates/browser/js/browser.js b/web/pgadmin/browser/templates/browser/js/browser.js
index ad0f16593..12ffd6f36 100644
--- a/web/pgadmin/browser/templates/browser/js/browser.js
+++ b/web/pgadmin/browser/templates/browser/js/browser.js
@@ -12,7 +12,8 @@ function(require, $, _, S, Bootstrap, pgAdmin, alertify, CodeMirror) {
// Some scripts do export their object in the window only.
// Generally the one, which do no have AMD support.
- var wcDocker = window.wcDocker;
+ var wcDocker = window.wcDocker,
+ onbeforeunload_flag = true;
$ = $ || window.jQuery || window.$;
Bootstrap = Bootstrap || window.Bootstrap;
@@ -255,10 +256,19 @@ function(require, $, _, S, Bootstrap, pgAdmin, alertify, CodeMirror) {
}], false);
$obj_mnu.append(create_submenu.$el);
}
+ // Drop down menu for reset layout
+ var $file_mnu = navbar.find('li#mnu_file > ul.dropdown-menu').first();
+ if($file_mnu) {
+ $file_mnu.append('
'
+ );
+ }
},
init: function() {
var obj=this;
-
+ obj.save_layout = true;
if (obj.initialized) {
return;
}
@@ -266,11 +276,16 @@ function(require, $, _, S, Bootstrap, pgAdmin, alertify, CodeMirror) {
// Store the main browser layout
$(window).bind('unload', function() {
- if(obj.docker) {
- state = obj.docker.save();
- settings = { setting: "Browser/Layout", value: state };
- $.post("{{ url_for('settings.store') }}", settings);
- }
+ if(obj.docker && obj.save_layout) {
+ state = obj.docker.save();
+ settings = { setting: "Browser/Layout", value: state };
+ $.ajax({
+ type: 'POST',
+ url: "{{ url_for('settings.store') }}",
+ data: settings,
+ async:false
+ });
+ }
return true;
});
@@ -634,21 +649,55 @@ function(require, $, _, S, Bootstrap, pgAdmin, alertify, CodeMirror) {
navbar.children('#mnu_obj').removeClass('hide');
obj.enable_disable_menus();
+ },
+ // We will force unload method to not to save current layout
+ // and reload the window
+ reset_current_layout: function() {
+ var obj = this;
+ alertify.confirm('{{ _('Reset layout') }}',
+ '{{ _('Are you sure you want to reset the current layout? This will cause the application to reload and any un-saved data will be lost.') }}',
+ function() {
+ // User clicked OK button...
+ var current_url = document.URL;
+
+ // Delete the record from database as well, then only reload page
+ $.ajax({
+ url: '{{ url_for('settings.reset_layout') }}',
+ type: 'DELETE',
+ async: false,
+ error: function() {
+ console.log('Something went wrong on server while resetting layout');
+ }
+ });
+
+ // Toggle flag which will prevents save again
+ obj.save_layout = false;
+ // Flag will prevent onbeforeunload function to be called
+ onbeforeunload_flag = false;
+ // Now reload page
+ location.reload(true);
+ },
+ function() {
+ // Do nothing as user cancel the operation
+ }
+ );
}
});
+
window.onbeforeunload = function(ev) {
var e = ev || window.event;
+ if(onbeforeunload_flag) {
+ var msg = '{{ _('Do you really want to leave the page?') }}';
- var msg = '{{ _('Do you really want to leave the page?') }}';
+ // For IE and Firefox prior to version 4
+ if (e) {
+ e.returnValue = msg;
+ }
- // For IE and Firefox prior to version 4
- if (e) {
- e.returnValue = msg;
+ // For Safari
+ return msg;
}
-
- // For Safari
- return msg;
};
return pgAdmin.Browser;
diff --git a/web/pgadmin/settings/__init__.py b/web/pgadmin/settings/__init__.py
index a245affc2..a3f529ee6 100644
--- a/web/pgadmin/settings/__init__.py
+++ b/web/pgadmin/settings/__init__.py
@@ -110,3 +110,23 @@ def get(setting=None, default=None):
errormsg=errormsg,
info=info,
result=request.form)
+
+
+@blueprint.route("/reset_layout", methods=['DELETE'])
+@login_required
+def reset_layout():
+ """Reset configuration setting"""
+ if request.method == 'DELETE':
+ # There can be only one record at most
+ data = Setting.query.filter_by(user_id=current_user.id).first()
+ try:
+ if data is not None:
+ db.session.delete(data)
+ db.session.commit()
+ except Exception as e:
+ return make_json_response(
+ status=410, success=0, errormsg=str(e)
+ )
+
+ return make_json_response(result=request.form)
+