From 5817f0e6db2681540aeb3af6b25b175e56a5f228 Mon Sep 17 00:00:00 2001 From: fw-bot Date: Tue, 8 Oct 2019 17:04:02 +0000 Subject: [PATCH] [FIX] web: list many2one quick-create Allows the quick create on m2o in list views Before this commit, when entering a new value in a many2one in a list and exiting the cell through a click, the quick-create modal appeared for the duration of the mousedown. Now, the modal remains and allow to edit the new many2one value Task 2076380 X-original-commit: c00f84eb0a176b8d23927080078eb02dc2e5d806 --- .../static/src/js/fields/relational_fields.js | 20 ++++++++++++- addons/web/static/tests/views/list_tests.js | 30 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js index 2e14ee56e8d69..f54f46e4ebfaf 100644 --- a/addons/web/static/src/js/fields/relational_fields.js +++ b/addons/web/static/src/js/fields/relational_fields.js @@ -901,7 +901,12 @@ var ListFieldMany2One = FieldMany2One.extend({ this.m2oDialogFocused = false; }, /** - * In list views, we don't want to try to trigger a fieldChange when the field + * In case the focus is lost from a mousedown, we want to prevent the click occuring on the + * following mouseup since it might trigger some unwanted list functions. + * If it's not the case, we want to remove the added handler on the next mousedown. + * @see list_editable_renderer._onWindowClicked() + * + * Also, in list views, we don't want to try to trigger a fieldChange when the field * is being emptied. Instead, it will be triggered as the user leaves the field * while it is empty. * @@ -909,6 +914,19 @@ var ListFieldMany2One = FieldMany2One.extend({ * @private */ _onInputFocusout: function () { + if (this.can_create && this.floating) { + // In case the focus out is due to a mousedown, we want to prevent the next click + var attachedEvents = ['click', 'mousedown']; + var stopNextClick = (function (ev) { + ev.stopPropagation(); + attachedEvents.forEach(function (eventName) { + window.removeEventListener(eventName, stopNextClick, true); + }); + }).bind(this); + attachedEvents.forEach(function (eventName) { + window.addEventListener(eventName, stopNextClick, true); + }); + } this._super.apply(this, arguments); if (!this.m2oDialogFocused && this.$input.val() === "" && this.mustSetValue) { this.reinitialize(false); diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js index 32c868a9bb069..a78d99e5edb6c 100644 --- a/addons/web/static/tests/views/list_tests.js +++ b/addons/web/static/tests/views/list_tests.js @@ -8258,6 +8258,36 @@ QUnit.module('Views', { list.destroy(); }); + QUnit.test("quickcreate in a many2one in a list", async function (assert) { + assert.expect(2); + + const list = await createView({ + arch: '', + data: this.data, + model: 'foo', + View: ListView, + }); + + await testUtils.dom.click(list.$('.o_data_row:first .o_data_cell:first')); + + const $input = list.$('.o_data_row:first .o_data_cell:first input'); + await testUtils.fields.editInput($input, "aaa"); + $input.trigger('keyup'); + $input.trigger('blur'); + document.body.click(); + + await testUtils.nextTick(); + + assert.containsOnce(document.body, '.modal', "the quick_create modal should appear"); + + await testUtils.dom.click($('.modal .btn-primary:first')); + await testUtils.dom.click(document.body); + + assert.strictEqual(list.el.getElementsByClassName('o_data_cell')[0].innerHTML, "aaa", + "value should have been updated"); + + list.destroy(); + }); QUnit.test('float field render with digits attribute on listview', async function (assert) { assert.expect(1);