diff --git a/docs/en_US/release_notes_4_2.rst b/docs/en_US/release_notes_4_2.rst index 3f88e6e00..76abbf0c7 100644 --- a/docs/en_US/release_notes_4_2.rst +++ b/docs/en_US/release_notes_4_2.rst @@ -30,4 +30,5 @@ Bug fixes | `Bug #3862 `_ - Fixed keyboard navigation for dialog tabs. | `Bug #3871 `_ - Fixed alignment of tree arrow icons for Internet Explorer. | `Bug #3891 `_ - Correct order of Save and Cancel button for json/jsonb editing. -| `Bug #3897 `_ - Data should be updated properly for FTS Configurations, FTS Dictionaries, FTS Parsers and FTS Templates. \ No newline at end of file +| `Bug #3897 `_ - Data should be updated properly for FTS Configurations, FTS Dictionaries, FTS Parsers and FTS Templates. +| `Bug #3908 `_ - Fixed keyboard navigation for Select2 and Privilege cell in Backgrid. \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/column/static/js/column.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/column/static/js/column.js index 9031d94ca..b00998bf3 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/column/static/js/column.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/column/static/js/column.js @@ -269,39 +269,7 @@ define('pgadmin.node.column', [ type: 'text', disabled: 'notInSchema', mode: ['properties'], },{ id: 'cltype', label: gettext('Data type'), - cell: Backgrid.Extension.NodeAjaxOptionsCell.extend({ - exitEditMode: function(e) { - var self = this; - this.$select.off('blur', this.exitEditMode); - this.$select.select2('close'); - this.$el.removeClass('editor'); - // Once user have selected a value - // we can shift to next cell if it is editable - var next_cell, length_cell = this.$el.next(), - not_null_cell = this.$el.next().next().next(); - - // Add delay so that Select2 cell tab event is captured - // first before triggerring backgrid:edited event. - setTimeout(function() { - // First check Length column if it is disable then goto - // Not Null column - if(length_cell && length_cell.hasClass('editable') && e) { - next_cell = length_cell; - } else if(not_null_cell && not_null_cell.hasClass('editable') && e) { - next_cell = not_null_cell; - } - - if(next_cell) { - e.preventDefault(); - e.stopPropagation(); - var command = new Backgrid.Command({key: 'Tab', keyCode: 9, which: 9}); - self.model.trigger('backgrid:edited', self.model, self.column, - command); - next_cell.trigger('focus'); - } - }, 20); - }, - }), + cell: Backgrid.Extension.NodeAjaxOptionsCell, type: 'text', disabled: 'inSchemaWithColumnCheck', control: 'node-ajax-options', url: 'get_types', node: 'table', cellHeaderClasses:'width_percent_30', first_empty: true, diff --git a/web/pgadmin/browser/server_groups/servers/static/js/privilege.js b/web/pgadmin/browser/server_groups/servers/static/js/privilege.js index c5663f741..5476cf8fc 100644 --- a/web/pgadmin/browser/server_groups/servers/static/js/privilege.js +++ b/web/pgadmin/browser/server_groups/servers/static/js/privilege.js @@ -329,13 +329,13 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform', '">', ' ', ' ', ' ', ' ', ' ', ' ', @@ -344,6 +344,7 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform', events: { 'change': 'privilegeChanged', 'blur': 'lostFocus', + 'keydown': 'lostFocus', }, render: function () { @@ -608,7 +609,42 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform', node = node.parentNode; } return false; - }; + }, + model = this.model, + column = this.column, + command = new Backgrid.Command(ev), + coll = this.model.get(this.column.get('name')); + + if (command.moveUp() || command.moveDown() || command.save()) { + // backgrid vertical navigation (Up/Down arrow key) + ev.preventDefault(); + ev.stopPropagation(); + model.trigger('backgrid:edited', model, column, command); + return; + } + // esc + else if (command.cancel()) { + // undo + ev.stopPropagation(); + model.trigger('backgrid:edited', model, column, command); + return; + } else if (command.moveRight()) { + // If we are at the last privilege then we should move to next cell + if (coll.last().get('privilege_type') === $(ev.target).attr('privilege')) { + if ((ev.target.name === 'privilege' && !ev.target.checked ) || + $(ev.target).attr('name') === 'with_grant') { + ev.stopPropagation(); + model.trigger('backgrid:edited', model, column, command); + return; + } + } + } else if (command.moveLeft() && ev.target.name === 'privilege' && + $(ev.target).attr('privilege') === 'ALL') { + // If we are at the fist privilege then we should move to previous cell + ev.stopPropagation(); + model.trigger('backgrid:edited', model, column, command); + return; + } /* * Between leaving the old element focus and entering the new element focus the @@ -630,7 +666,6 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform', var m = self.model; m.trigger('backgrid:edited', m, self.column, new Backgrid.Command(ev)); }},10); - return; }, }); @@ -700,6 +735,30 @@ define(['sources/gettext', 'underscore', 'jquery', 'backbone', 'backform', } }); }, + + events: { + 'click': 'enterEditMode', + 'keydown': 'saveOrCancel', + }, + + saveOrCancel: function (e) { + var model = this.model; + var column = this.column; + var command = new Backgrid.Command(e); + + if (command.moveUp() || command.moveDown() || command.moveLeft() || command.moveRight() || + command.save()) { + e.preventDefault(); + e.stopPropagation(); + model.trigger('backgrid:edited', model, column, command); + } + // esc + else if (command.cancel()) { + // undo + e.stopPropagation(); + model.trigger('backgrid:edited', model, column, command); + } + }, }); return PrivilegeRoleModel; diff --git a/web/pgadmin/static/js/backgrid.pgadmin.js b/web/pgadmin/static/js/backgrid.pgadmin.js index 2832b5ac8..9ea4ad43f 100644 --- a/web/pgadmin/static/js/backgrid.pgadmin.js +++ b/web/pgadmin/static/js/backgrid.pgadmin.js @@ -591,11 +591,29 @@ define([ this.$el.removeClass('editor'); }, + saveOrCancel: function (e) { + var model = this.model; + var column = this.column; + + var command = new Backgrid.Command(e); + var blurred = e.type === 'blur'; + + if (command.moveUp() || command.moveDown() || command.moveLeft() || command.moveRight() || + command.save() || blurred) { + + this.exitEditMode(); + e.preventDefault(); + e.stopPropagation(); + model.trigger('backgrid:edited', model, column, command); + } + }, events: { 'select2:open': 'enterEditMode', 'select2:close': 'exitEditMode', 'change': 'onSave', 'select2:unselect': 'onSave', + 'blur': 'saveOrCancel', + 'keydown': 'saveOrCancel', }, /** @property {function(Object, ?Object=): string} template */ template: _.template([ diff --git a/web/pgadmin/static/scss/_pgadmin.style.scss b/web/pgadmin/static/scss/_pgadmin.style.scss index 26d24c890..6726b5f1f 100644 --- a/web/pgadmin/static/scss/_pgadmin.style.scss +++ b/web/pgadmin/static/scss/_pgadmin.style.scss @@ -656,6 +656,10 @@ fieldset.inline-fieldset > div { outline: none; } +input[type="checkbox"]:focus { + outline: $color-primary auto 5px !important; +} + div.rolmembership { margin-top: 15px; }