diff --git a/addons/web/static/src/views/kanban/kanban_renderer.js b/addons/web/static/src/views/kanban/kanban_renderer.js index 88bfc3076f5..fc4b2c8f6e6 100644 --- a/addons/web/static/src/views/kanban/kanban_renderer.js +++ b/addons/web/static/src/views/kanban/kanban_renderer.js @@ -606,16 +606,19 @@ export class KanbanRenderer extends Component { */ focusNextCard(area, direction) { const { isGrouped } = this.props.list; + const closestCard = document.activeElement.closest(".o_kanban_record"); + if (!closestCard) { + return; + } const groups = isGrouped ? [...area.querySelectorAll(".o_kanban_group")] : [area]; const cards = [...groups] .map((group) => [...group.querySelectorAll(".o_kanban_record")]) .filter((group) => group.length); - // Search current card position let iGroup; let iCard; for (iGroup = 0; iGroup < cards.length; iGroup++) { - const i = cards[iGroup].indexOf(document.activeElement); + const i = cards[iGroup].indexOf(closestCard); if (i !== -1) { iCard = i; break; diff --git a/addons/web/static/tests/views/kanban_view_tests.js b/addons/web/static/tests/views/kanban_view_tests.js index 6e4e7d965dc..44bd827e7bd 100644 --- a/addons/web/static/tests/views/kanban_view_tests.js +++ b/addons/web/static/tests/views/kanban_view_tests.js @@ -9755,6 +9755,31 @@ QUnit.module("Views", (hooks) => { assert.strictEqual(document.activeElement, getCard(0), "the first card should be focussed"); }); + QUnit.test("keyboard navigation on kanban basic rendering does not crash when the focus is inside a card", async (assert) => { + await makeView({ + type: "kanban", + resModel: "partner", + serverData, + arch: + '' + + "
" + + '' + + '' + + 'ho! this is focussable' + + "
" + + "
", + }); + + getCard(0).querySelector(".o-this-is-focussable").focus(); + triggerHotkey("ArrowDown"); + + assert.strictEqual( + document.activeElement, + getCard(1), + "the second card should be focussed" + ); + }); + QUnit.test("keyboard navigation on kanban grouped rendering", async (assert) => { await makeView({ type: "kanban",