summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--addons/web/static/src/js/views/list/list_editable_renderer.js10
-rw-r--r--addons/web/static/tests/views/list_tests.js46
2 files changed, 51 insertions, 5 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 99bbcfbb814..2cfe3191a99 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
@@ -1815,12 +1815,12 @@ ListRenderer.include({
return;
}
- // ignore clicks in modals, except if the list is in a modal, and the
- // click is performed in that modal
- var $clickModal = $(event.target).closest('.modal');
- if ($clickModal.length) {
+ // ignore clicks if there is a modal, except if the list is in the last
+ // (active) modal
+ var $modal = $('.modal:last');
+ if ($modal.length) {
var $listModal = this.$el.closest('.modal');
- if ($clickModal.prop('id') !== $listModal.prop('id')) {
+ if ($modal.prop('id') !== $listModal.prop('id')) {
return;
}
}
diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js
index 81e95ddfabc..64894f3095a 100644
--- a/addons/web/static/tests/views/list_tests.js
+++ b/addons/web/static/tests/views/list_tests.js
@@ -8175,6 +8175,52 @@ QUnit.module('Views', {
list.destroy();
});
+ QUnit.test('editable list with many2one: click out does not discard the row', async function (assert) {
+ // In this test, we simulate a long click by manually triggering a mousedown and later on
+ // mouseup and click events
+ assert.expect(5);
+
+ this.data.bar.fields.m2o = {string: "M2O field", type: "many2one", relation: "foo"};
+
+ const form = await createView({
+ View: FormView,
+ model: 'foo',
+ data: this.data,
+ arch: `
+ <form>
+ <field name="display_name"/>
+ <field name="o2m">
+ <tree editable="bottom">
+ <field name="m2o" required="1"/>
+ </tree>
+ </field>
+ </form>`,
+ });
+
+ assert.containsNone(form, '.o_data_row');
+
+ await testUtils.dom.click(form.$('.o_field_x2many_list_row_add > a'));
+ assert.containsOnce(form, '.o_data_row');
+
+ // focus and write something in the m2o
+ form.$('.o_field_many2one input').focus().val('abcdef').trigger('keyup');
+ await testUtils.nextTick();
+
+ // then simulate a mousedown outside
+ form.$('.o_field_widget[name="display_name"]').focus().trigger('mousedown');
+ await testUtils.nextTick();
+ assert.containsOnce(document.body, '.modal', "should ask confirmation to create a record");
+
+ // trigger the mouseup and the click
+ form.$('.o_field_widget[name="display_name"]').trigger('mouseup').trigger('click');
+ await testUtils.nextTick();
+
+ assert.containsOnce(document.body, '.modal', "modal should still be displayed");
+ assert.containsOnce(form, '.o_data_row', "the row should still be there");
+
+ form.destroy();
+ });
+
QUnit.test('list grouped by date:month', async function (assert) {
assert.expect(1);