From 291dad6bc869eeeba9bbb5cf13d498ece9266d2d Mon Sep 17 00:00:00 2001 From: Julien Mougenot Date: Wed, 14 Aug 2019 13:00:26 +0000 Subject: [PATCH] [FIX] web: fixed crash in editable grouped lists Adding a line in grouped listviews caused a crash in some cases. Steps to reproduce: - go in any grouped editable list view - click on any "Add a line" cell, but not on the link itself - press ENTER Before this commit: A crash occured. Unable to add a new line. Needed to refresh the page. After this commit: Line addition functionnality properly working even when selecting the outer cell --- .../js/views/list/list_editable_renderer.js | 7 ++++-- addons/web/static/tests/views/list_tests.js | 22 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) 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);