Avoid showing multiple 'Reset Layout' options under file menu. Fixes #1348

Also restructured code related to reset layout functionality.
This commit is contained in:
Harshal Dhumal 2016-06-14 15:01:15 +01:00 committed by Dave Page
parent 62c1369938
commit b0b21fd46c
3 changed files with 109 additions and 81 deletions

View File

@ -12,8 +12,7 @@ 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,
onbeforeunload_flag = true;
var wcDocker = window.wcDocker;
$ = $ || window.jQuery || window.$;
Bootstrap = Bootstrap || window.Bootstrap;
@ -256,19 +255,9 @@ 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('<li class="menu-item"><a href="#" onclick="pgAdmin.Browser.reset_current_layout()">' +
'<i class="fa fa-retweet"></i>' +
'<span>{{ _('Reset Layout') }}</span>' +
'</a></li>'
);
}
},
init: function() {
var obj=this;
obj.save_layout = true;
if (obj.initialized) {
return;
}
@ -276,7 +265,7 @@ function(require, $, _, S, Bootstrap, pgAdmin, alertify, CodeMirror) {
// Store the main browser layout
$(window).bind('unload', function() {
if(obj.docker && obj.save_layout) {
if(obj.docker) {
state = obj.docker.save();
settings = { setting: "Browser/Layout", value: state };
$.ajax({
@ -650,38 +639,6 @@ 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
}
);
},
// General function to handle callbacks for object or dialog help.
showHelp: function(type, url, node, item, label) {
if (type == "object_help") {
@ -736,18 +693,16 @@ function(require, $, _, S, Bootstrap, pgAdmin, alertify, CodeMirror) {
});
window.onbeforeunload = function(ev) {
var e = ev || window.event;
if(onbeforeunload_flag) {
var msg = '{{ _('Do you really want to leave the page?') }}';
var e = ev || window.event,
msg = '{{ _('Do you really want to leave the page?') }}';
// For IE and Firefox prior to version 4
if (e) {
e.returnValue = msg;
}
// For Safari
return msg;
// For IE and Firefox prior to version 4
if (e) {
e.returnValue = msg;
}
// For Safari
return msg;
};
return pgAdmin.Browser;

View File

@ -13,14 +13,41 @@ from flask.ext.login import current_user
from pgadmin.model import db, Setting
import traceback
from flask import Response, request, render_template
from flask import Response, request, render_template, url_for
from flask.ext.security import login_required
from pgadmin.utils.ajax import make_json_response
from pgadmin.utils.ajax import make_json_response, bad_request
from pgadmin.utils import PgAdminModule
from pgadmin.utils.menu import MenuItem
from flask.ext.babel import gettext
MODULE_NAME = 'settings'
class SettingsModule(PgAdminModule):
def get_own_javascripts(self):
return [{
'name': 'pgadmin.settings',
'path': url_for('settings.index') + 'settings',
'when': None
}]
def get_own_menuitems(self):
return {
'file_items': [
MenuItem(name='mnu_resetlayout',
priority=999,
module="pgAdmin.Settings",
callback='show',
icon='fa fa-retweet',
label=gettext('Reset Layout'))
]
}
blueprint = SettingsModule(MODULE_NAME, __name__)
def store_setting(setting, value):
"""Set a configuration setting for the current user."""
data = Setting(user_id=current_user.id, setting=setting, value=value)
@ -28,6 +55,7 @@ def store_setting(setting, value):
db.session.merge(data)
db.session.commit()
def get_setting(setting, default=None):
"""Retrieve a configuration setting for the current user, or return the
default value specified by the caller."""
@ -38,8 +66,11 @@ def get_setting(setting, default=None):
else:
return data.value
# Initialise the module
blueprint = PgAdminModule(MODULE_NAME, __name__, template_folder='templates', url_prefix='/' + MODULE_NAME)
@blueprint.route("/")
@login_required
def index():
return bad_request(errormsg=_("This URL can not be called directly."))
@blueprint.route("/settings.js")
@login_required
@ -116,17 +147,17 @@ def get(setting=None, default=None):
@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)
)
# 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)

View File

@ -1,13 +1,55 @@
// Store a single setting
function storeSetting(setting, value) {
$.post("{{ url_for('settings.store') }}", { setting: setting, value: value });
}
define(
['jquery', 'alertify', 'pgadmin', 'underscore', 'backform', 'pgadmin.backform'],
// Store a number of settings.
// settings is a javascript object containing values for settingX and valueX,
// along with a count value which equals the number of setting/value pairs.
// X is 1 based.
function storeSetting(settings) {
$.post("{{ url_for('settings.store') }}", settings);
}
// This defines the Preference/Options Dialog for pgAdmin IV.
function($, alertify, pgAdmin, _, Backform) {
pgAdmin = pgAdmin || window.pgAdmin || {};
/*
* Hmm... this module is already been initialized, we can refer to the old
* object from here.
*/
if (pgAdmin.Settings)
return pgAdmin.Settings;
pgAdmin.Settings = {
init: function() {
if (this.initialized)
return;
this.initialized = true;
},
// We will force unload method to not to save current layout
// and reload the window
show: 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() {
// Delete the record from database as well, then only reload page
$.ajax({
url: '{{ url_for('settings.reset_layout') }}',
type: 'DELETE',
async: false,
success: function() {
// Prevent saving layout on server for next page reload.
$(window).unbind('unload');
window.onbeforeunload = null;
// Now reload page
location.reload(true);
},
error: function() {
console.log('Something went wrong on server while resetting layout');
}
});
},
function() {
// Do nothing as user canceled the operation.
}
);
}
};
return pgAdmin.Settings;
});