From 7cf68c838ba6c293f92def369c7c941cb0a4de7e Mon Sep 17 00:00:00 2001 From: Vincent Schippefilt Date: Wed, 25 Apr 2018 11:52:44 +0200 Subject: [PATCH] [FIX] web: kanban card do correct action on ENTER key When the focus is on a kanban card that do not have oe_kanban_global_click or oe_kanban_global_click_edit when hitting the ENTER key, before this fix, the default action was to open the record of the card after this fix, the action executed will be the action of the first button or link of the card if the card has the oe_kanban_global_click or oe_kanban_global_click_edit class, the record still opens with ENTER key --- .../src/js/views/kanban/kanban_record.js | 30 +++++++++++++++++-- addons/web/static/tests/views/kanban_tests.js | 28 +++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/addons/web/static/src/js/views/kanban/kanban_record.js b/addons/web/static/src/js/views/kanban/kanban_record.js index 072f4d41f27..30bafaab117 100644 --- a/addons/web/static/src/js/views/kanban/kanban_record.js +++ b/addons/web/static/src/js/views/kanban/kanban_record.js @@ -23,7 +23,6 @@ var KanbanRecord = Widget.extend({ events: { 'click .oe_kanban_action': '_onKanbanActionClicked', 'click .o_kanban_manage_toggle_button': '_onManageTogglerClicked', - 'keydown' : '_onKanbanKeyDown', }, /** * @override @@ -289,6 +288,9 @@ var KanbanRecord = Widget.extend({ if (this.$el.hasClass('oe_kanban_global_click') || this.$el.hasClass('oe_kanban_global_click_edit')) { this.$el.on('click', this._onGlobalClick.bind(this)); + this.$el.on('keydown', this._onKeyDownCard.bind(this)); + } else { + this.$el.on('keydown', this._onKeyDownOpenFirstLink.bind(this)); } this._processFields(); this._processWidgets(); @@ -505,11 +507,33 @@ var KanbanRecord = Widget.extend({ this.do_warn("Kanban: no action for type : " + type); } }, - _onKanbanKeyDown: function (event) { + /** + * This event is linked to the kanban card when there is a global_click + * class on this card + * + * @private + * @param {KeyDownEvent} event + */ + _onKeyDownCard: function (event) { switch (event.keyCode) { case $.ui.keyCode.ENTER: event.preventDefault(); - this._openRecord(); + this._onGlobalClick(event); + break; + } + }, + /** + * This event is linked ot the kanban card when there is no global_click + * class on the card + * + * @private + * @param {KeyDownEvent} event + */ + _onKeyDownOpenFirstLink: function (event) { + switch (event.keyCode) { + case $.ui.keyCode.ENTER: + event.preventDefault(); + $(event.target).find('a, button').first().click(); break; } }, diff --git a/addons/web/static/tests/views/kanban_tests.js b/addons/web/static/tests/views/kanban_tests.js index c5e5f606f61..9a5f9f8f0a0 100644 --- a/addons/web/static/tests/views/kanban_tests.js +++ b/addons/web/static/tests/views/kanban_tests.js @@ -3587,6 +3587,34 @@ QUnit.module('Views', { kanban.destroy(); }); + + QUnit.test('keyboard navigation on kanban when the focus is on a link that' + + 'has an action and the kanban has no oe_kanban_global_... class', function(assert){ + assert.expect(1) + var kanban = createView({ + View: KanbanView, + model: 'partner', + data: this.data, + arch: '' + + '
Edit
' + + '
', + }); + + testUtils.intercept(kanban, 'switch_view', function (event) { + assert.deepEqual(event.data, { + view_type: 'form', + res_id: 1, + mode: 'edit', + model: 'partner', + },'When selecting focusing a card and hitting ENTER, the first link or button is clicked'); + }); + kanban.$('.o_kanban_record').first().focus().trigger($.Event('keydown', { + keyCode: $.ui.keyCode.ENTER, + which: $.ui.keyCode.ENTER, + })); + + kanban.destroy(); + }); }); });