mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2025-02-25 18:55:31 -06:00
Realtime preference handling for the Dashboards and Debugger. Fixes #3294
This commit is contained in:
committed by
Dave Page
parent
ae814d76d3
commit
f7e43d5e50
@@ -293,33 +293,6 @@ def update_session_function_transaction(trans_id, data):
|
||||
session['functionData'] = function_data
|
||||
|
||||
|
||||
def get_shortcuts_for_accesskey():
|
||||
"""
|
||||
This function will fetch and return accesskey shortcuts for debugger
|
||||
toolbar buttons
|
||||
|
||||
Returns:
|
||||
Dict of shortcut keys
|
||||
"""
|
||||
# Fetch debugger preferences
|
||||
dp = Preferences.module('debugger')
|
||||
btn_start = dp.preference('btn_start').get()
|
||||
btn_stop = dp.preference('btn_stop').get()
|
||||
btn_step_into = dp.preference('btn_step_into').get()
|
||||
btn_step_over = dp.preference('btn_step_over').get()
|
||||
btn_toggle_breakpoint = dp.preference('btn_toggle_breakpoint').get()
|
||||
btn_clear_breakpoints = dp.preference('btn_clear_breakpoints').get()
|
||||
|
||||
return {
|
||||
'start': btn_start.get('key').get('char'),
|
||||
'stop': btn_stop.get('key').get('char'),
|
||||
'step_into': btn_step_into.get('key').get('char'),
|
||||
'step_over': btn_step_over.get('key').get('char'),
|
||||
'toggle_breakpoint': btn_toggle_breakpoint.get('key').get('char'),
|
||||
'clear_breakpoints': btn_clear_breakpoints.get('key').get('char')
|
||||
}
|
||||
|
||||
|
||||
@blueprint.route(
|
||||
'/init/<node_type>/<int:sid>/<int:did>/<int:scid>/<int:fid>',
|
||||
methods=['GET'], endpoint='init_for_function'
|
||||
@@ -589,7 +562,6 @@ def direct_new(trans_id):
|
||||
is_linux=is_linux_platform,
|
||||
client_platform=user_agent.platform,
|
||||
stylesheets=[url_for('debugger.static', filename='css/debugger.css')],
|
||||
accesskey=get_shortcuts_for_accesskey()
|
||||
)
|
||||
|
||||
|
||||
@@ -811,12 +783,8 @@ def initialize_target(debug_type, sid, did, scid, func_id, tri_id=None):
|
||||
# is initialized
|
||||
del session['funcData']
|
||||
|
||||
pref = Preferences.module('debugger')
|
||||
new_browser_tab = pref.preference('debugger_new_browser_tab').get()
|
||||
|
||||
return make_json_response(data={'status': status,
|
||||
'debuggerTransId': trans_id,
|
||||
'newBrowserTab': new_browser_tab})
|
||||
'debuggerTransId': trans_id})
|
||||
|
||||
|
||||
@blueprint.route(
|
||||
|
@@ -184,6 +184,18 @@ define([
|
||||
});
|
||||
|
||||
this.frame.load(pgBrowser.docker);
|
||||
|
||||
let self = this;
|
||||
let cacheIntervalId = setInterval(function() {
|
||||
try {
|
||||
self.preferences = window.top.pgAdmin.Browser;
|
||||
clearInterval(cacheIntervalId);
|
||||
}
|
||||
catch(err) {
|
||||
clearInterval(cacheIntervalId);
|
||||
throw err;
|
||||
}
|
||||
});
|
||||
},
|
||||
// It will check weather the function is actually debuggable or not with pre-required condition.
|
||||
can_debug: function(itemData, item, data) {
|
||||
@@ -313,7 +325,8 @@ define([
|
||||
var t = pgBrowser.tree,
|
||||
i = item || t.selected(),
|
||||
d = i && i.length == 1 ? t.itemData(i) : undefined,
|
||||
node = d && pgBrowser.Nodes[d._type];
|
||||
node = d && pgBrowser.Nodes[d._type],
|
||||
self = this;
|
||||
|
||||
if (!d)
|
||||
return;
|
||||
@@ -384,7 +397,7 @@ define([
|
||||
'trans_id': res.data.debuggerTransId,
|
||||
});
|
||||
|
||||
if (res.data.newBrowserTab) {
|
||||
if (self.preferences.debugger_new_browser_tab) {
|
||||
window.open(url, '_blank');
|
||||
} else {
|
||||
pgBrowser.Events.once(
|
||||
@@ -435,7 +448,8 @@ define([
|
||||
var t = pgBrowser.tree,
|
||||
i = item || t.selected(),
|
||||
d = i && i.length == 1 ? t.itemData(i) : undefined,
|
||||
node = d && pgBrowser.Nodes[d._type];
|
||||
node = d && pgBrowser.Nodes[d._type],
|
||||
self = this;
|
||||
|
||||
if (!d)
|
||||
return;
|
||||
@@ -499,7 +513,7 @@ define([
|
||||
'trans_id': res.data.debuggerTransId,
|
||||
});
|
||||
|
||||
if (res.data.newBrowserTab) {
|
||||
if (self.preferences.debugger_new_browser_tab) {
|
||||
window.open(url, '_blank');
|
||||
} else {
|
||||
pgBrowser.Events.once(
|
||||
|
@@ -1393,7 +1393,7 @@ define([
|
||||
controller about the click and controller will take the action for the specified button click.
|
||||
*/
|
||||
var DebuggerToolbarView = Backbone.View.extend({
|
||||
el: '.dubugger_main_container',
|
||||
el: '.debugger_main_container',
|
||||
initialize: function() {
|
||||
controller.on('pgDebugger:button:state:stop', this.enable_stop, this);
|
||||
controller.on('pgDebugger:button:state:step_over', this.enable_step_over, this);
|
||||
@@ -1496,44 +1496,11 @@ define([
|
||||
controller.Step_into(pgTools.DirectDebug.trans_id);
|
||||
},
|
||||
keyAction: function (event) {
|
||||
var $el = this.$el, panel_id, actual_panel;
|
||||
|
||||
// If already fetched earlier then don't do it again
|
||||
if(_.size(pgTools.DirectDebug.debugger_keyboard_shortcuts) == 0) {
|
||||
// Fetch keyboard shortcut keys
|
||||
var edit_grid_shortcut_perf, next_panel_perf, previous_panel_perf;
|
||||
edit_grid_shortcut_perf = window.top.pgAdmin.Browser.get_preference(
|
||||
'debugger', 'edit_grid_values'
|
||||
);
|
||||
next_panel_perf = window.top.pgAdmin.Browser.get_preference(
|
||||
'debugger', 'move_next'
|
||||
);
|
||||
previous_panel_perf = window.top.pgAdmin.Browser.get_preference(
|
||||
'debugger', 'move_previous'
|
||||
);
|
||||
|
||||
// If debugger opened in new Tab then window.top won't be available
|
||||
if(!edit_grid_shortcut_perf || !next_panel_perf || !previous_panel_perf) {
|
||||
edit_grid_shortcut_perf = window.opener.pgAdmin.Browser.get_preference(
|
||||
'debugger', 'edit_grid_values'
|
||||
);
|
||||
next_panel_perf = window.opener.pgAdmin.Browser.get_preference(
|
||||
'debugger', 'move_next'
|
||||
);
|
||||
previous_panel_perf = window.opener.pgAdmin.Browser.get_preference(
|
||||
'debugger', 'move_previous'
|
||||
);
|
||||
}
|
||||
|
||||
pgTools.DirectDebug.debugger_keyboard_shortcuts = {
|
||||
'edit_grid_keys': edit_grid_shortcut_perf.value,
|
||||
'next_panel_keys': next_panel_perf.value,
|
||||
'previous_panel_keys': previous_panel_perf.value,
|
||||
};
|
||||
}
|
||||
var $el = this.$el, panel_id, actual_panel,
|
||||
self = this;
|
||||
|
||||
panel_id = keyboardShortcuts.processEventDebugger(
|
||||
$el, event, pgTools.DirectDebug.debugger_keyboard_shortcuts
|
||||
$el, event, self.preferences
|
||||
);
|
||||
|
||||
// Panel navigation
|
||||
@@ -1572,7 +1539,10 @@ define([
|
||||
this.debug_restarted = false;
|
||||
this.is_user_aborted_debugging = false;
|
||||
this.is_polling_required = true; // Flag to stop unwanted ajax calls
|
||||
this.debugger_keyboard_shortcuts = {};
|
||||
|
||||
let browser = window.opener ?
|
||||
window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser;
|
||||
this.preferences = browser.get_preferences_for_module('sqleditor');
|
||||
|
||||
this.docker = new wcDocker(
|
||||
'#container', {
|
||||
@@ -1856,6 +1826,35 @@ define([
|
||||
if(self.docker.$container){
|
||||
self.docker.$container.parent().focus();
|
||||
}
|
||||
|
||||
let cacheIntervalId = setInterval(function() {
|
||||
try {
|
||||
let browser = window.opener ? window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser;
|
||||
if(browser.preference_version() > 0) {
|
||||
clearInterval(cacheIntervalId);
|
||||
self.reflectPreferences();
|
||||
|
||||
/* If debugger is in a new tab, event fired is not available
|
||||
* instead, a poller is set up who will check
|
||||
*/
|
||||
if(self.preferences.debugger_new_browser_tab) {
|
||||
let pollIntervalId = setInterval(()=>{
|
||||
if(window.opener && window.opener.pgAdmin) {
|
||||
self.reflectPreferences();
|
||||
}
|
||||
else {
|
||||
clearInterval(pollIntervalId);
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(err) {
|
||||
clearInterval(cacheIntervalId);
|
||||
throw err;
|
||||
}
|
||||
},0);
|
||||
|
||||
};
|
||||
|
||||
self.docker.startLoading(gettext('Loading...'));
|
||||
@@ -1863,8 +1862,50 @@ define([
|
||||
|
||||
// Create the toolbar view for debugging the function
|
||||
this.toolbarView = new DebuggerToolbarView();
|
||||
},
|
||||
|
||||
/* Cache may take time to load for the first time
|
||||
* Keep trying till available
|
||||
*/
|
||||
|
||||
|
||||
/* Register for preference changed event broadcasted in parent
|
||||
* to reload the shorcuts.
|
||||
*/
|
||||
pgBrowser.onPreferencesChange('debugger', function() {
|
||||
self.reflectPreferences();
|
||||
});
|
||||
},
|
||||
reflectPreferences: function() {
|
||||
let self = this,
|
||||
browser = window.opener ? window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser;
|
||||
self.preferences = browser.get_preferences_for_module('debugger');
|
||||
self.toolbarView.preferences = self.preferences;
|
||||
|
||||
/* Update the shortcuts of the buttons */
|
||||
self.toolbarView.$el.find('#btn-step-into')
|
||||
.attr('title', keyboardShortcuts.shortcut_accesskey_title('Step into',self.preferences.btn_step_into))
|
||||
.attr('accesskey', keyboardShortcuts.shortcut_key(self.preferences.btn_step_into));
|
||||
|
||||
self.toolbarView.$el.find('#btn-step-over')
|
||||
.attr('title', keyboardShortcuts.shortcut_accesskey_title('Step over',self.preferences.btn_step_over))
|
||||
.attr('accesskey', keyboardShortcuts.shortcut_key(self.preferences.btn_step_over));
|
||||
|
||||
self.toolbarView.$el.find('#btn-continue')
|
||||
.attr('title', keyboardShortcuts.shortcut_accesskey_title('Continue/Start',self.preferences.btn_start))
|
||||
.attr('accesskey', keyboardShortcuts.shortcut_key(self.preferences.btn_start));
|
||||
|
||||
self.toolbarView.$el.find('#btn-toggle-breakpoint')
|
||||
.attr('title', keyboardShortcuts.shortcut_accesskey_title('Toggle breakpoint',self.preferences.btn_toggle_breakpoint))
|
||||
.attr('accesskey', keyboardShortcuts.shortcut_key(self.preferences.btn_toggle_breakpoint));
|
||||
|
||||
self.toolbarView.$el.find('#btn-clear-breakpoint')
|
||||
.attr('title', keyboardShortcuts.shortcut_accesskey_title('Clear all breakpoints',self.preferences.btn_clear_breakpoints))
|
||||
.attr('accesskey', keyboardShortcuts.shortcut_key(self.preferences.btn_clear_breakpoints));
|
||||
|
||||
self.toolbarView.$el.find('#btn-stop')
|
||||
.attr('title', keyboardShortcuts.shortcut_accesskey_title('Stop',self.preferences.btn_stop))
|
||||
.attr('accesskey', keyboardShortcuts.shortcut_key(self.preferences.btn_stop));
|
||||
},
|
||||
// Register the panel with new debugger docker instance.
|
||||
registerPanel: function(name, title, width, height, onInit) {
|
||||
var self = this;
|
||||
|
@@ -35,47 +35,47 @@ try {
|
||||
.debugger-container .wcLoadingIcon.fa-pulse{-webkit-animation: none;}
|
||||
</style>
|
||||
{% endif %}
|
||||
<div class="dubugger_main_container" tabindex="0">
|
||||
<div class="debugger_main_container" tabindex="0">
|
||||
<nav class="navbar-inverse navbar-fixed-top">
|
||||
<div id="btn-toolbar" class="btn-toolbar pg-prop-btn-group bg-gray-2 border-gray-3" role="toolbar" aria-label="">
|
||||
<div class="btn-group" role="group" aria-label="">
|
||||
<button type="button" class="btn btn-default btn-step-into"
|
||||
title="{{ _('Step into') }}{{ _(' (accesskey+{0})'.format(accesskey.step_into)) }}"
|
||||
accesskey="{{ accesskey.step_into }}"
|
||||
<button type="button" class="btn btn-default btn-step-into" id="btn-step-into"
|
||||
title=""
|
||||
accesskey=""
|
||||
tabindex="0" autofocus="autofocus">
|
||||
<i class="fa fa-indent"></i>
|
||||
</button>
|
||||
<button type="button" class="btn btn-default btn-step-over"
|
||||
title="{{ _('Step over') }}{{ _(' (accesskey+{0})'.format(accesskey.step_over)) }}"
|
||||
accesskey="{{ accesskey.step_over }}"
|
||||
<button type="button" class="btn btn-default btn-step-over" id="btn-step-over"
|
||||
title=""
|
||||
accesskey=""
|
||||
tabindex="0">
|
||||
<i class="fa fa-outdent"></i>
|
||||
</button>
|
||||
<button type="button" class="btn btn-default btn-continue"
|
||||
title="{{ _('Continue/Start') }}{{ _(' (accesskey+{0})'.format(accesskey.start)) }}"
|
||||
accesskey="{{ accesskey.start }}"
|
||||
<button type="button" class="btn btn-default btn-continue" id="btn-continue"
|
||||
title=""
|
||||
accesskey=""
|
||||
tabindex="0">
|
||||
<i class="fa fa-play-circle"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="btn-group" role="group" aria-label="">
|
||||
<button type="button" class="btn btn-default btn-toggle-breakpoint"
|
||||
title="{{ _('Toggle breakpoint') }}{{ _(' (accesskey+{0})'.format(accesskey.toggle_breakpoint)) }}"
|
||||
accesskey="{{ accesskey.toggle_breakpoint }}"
|
||||
<button type="button" class="btn btn-default btn-toggle-breakpoint" id="btn-toggle-breakpoint"
|
||||
title=""
|
||||
accesskey=""
|
||||
tabindex="0">
|
||||
<i class="fa fa-circle"></i>
|
||||
</button>
|
||||
<button type="button" class="btn btn-default btn-clear-breakpoint"
|
||||
title="{{ _('Clear all breakpoints') }}{{ _(' (accesskey+{0})'.format(accesskey.clear_breakpoints)) }}"
|
||||
accesskey="{{ accesskey.clear_breakpoints }}"
|
||||
<button type="button" class="btn btn-default btn-clear-breakpoint" id="btn-clear-breakpoint"
|
||||
title=""
|
||||
accesskey=""
|
||||
tabindex="0">
|
||||
<i class="fa fa-ban"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="btn-group" role="group" aria-label="">
|
||||
<button type="button" class="btn btn-default btn-stop"
|
||||
accesskey="{{ accesskey.stop }}"
|
||||
title="{{ _('Stop') }}{{ _(' (accesskey+{0})'.format(accesskey.stop)) }}"
|
||||
<button type="button" class="btn btn-default btn-stop" id="btn-stop"
|
||||
accesskey=""
|
||||
title=""
|
||||
tabindex="0">
|
||||
<i class="fa fa-stop-circle"></i>
|
||||
</button>
|
||||
|
Reference in New Issue
Block a user