diff --git a/addons/web/static/src/js/views/list/list_editable_renderer.js b/addons/web/static/src/js/views/list/list_editable_renderer.js index af6fa29c210..979e0a41496 100644 --- a/addons/web/static/src/js/views/list/list_editable_renderer.js +++ b/addons/web/static/src/js/views/list/list_editable_renderer.js @@ -1035,7 +1035,10 @@ ListRenderer.include({ ev.stopPropagation(); var self = this; - var groupId = $(ev.target).data('group-id'); + // This method can be called when selecting the parent of the link. + // We need to ensure that the link is the actual target + const target = ev.target.tagName !== 'A' ? ev.target.getElementsByTagName('A')[0] : ev.target; + const groupId = target.dataset.groupId; this.currentGroupId = groupId; this.unselectRow().then(function () { self.trigger_up('add_record', { @@ -1195,7 +1198,7 @@ ListRenderer.include({ var correspondingRow = self._getRow(recordId); correspondingRow.children().eq(cellIndex).focus(); } else if (self.currentGroupId) { - self.$('a[data-group-id=' + self.currentGroupId + ']').focus(); + self.$('a[data-group-id="' + self.currentGroupId + '"]').focus(); } else { self.$('.o_field_x2many_list_row_add a:first').focus(); // FIXME } diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js index 48c0502b689..e79eb63d159 100644 --- a/addons/web/static/tests/views/list_tests.js +++ b/addons/web/static/tests/views/list_tests.js @@ -6273,6 +6273,28 @@ QUnit.module('Views', { list.destroy(); }); + QUnit.test('add and discard a line through keyboard navigation without crashing', async function (assert) { + assert.expect(2); + + var list = await createView({ + View: ListView, + model: 'foo', + data: this.data, + arch: '', + groupBy: ['bar'], + }); + + await testUtils.dom.click(list.$('.o_group_header:first')); // open group + // Triggers ENTER on "Add a line" wrapper cell + await testUtils.fields.triggerKeydown(list.$('.o_group_field_row_add'), 'enter'); + assert.containsN(list, 'tbody:nth(1) .o_data_row', 4, "new data row should be created"); + await testUtils.dom.click(list.$buttons.find('.o_list_button_discard')); + // At this point, a crash manager should appear if no proper link targetting + assert.containsN(list, 'tbody:nth(1) .o_data_row', 3,"new data row should be discarded."); + + list.destroy(); + }); + QUnit.test('editable grouped list with create="0"', async function (assert) { assert.expect(1);