diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js index 245643ece57..3ec0c027c77 100644 --- a/addons/web/static/src/js/fields/basic_fields.js +++ b/addons/web/static/src/js/fields/basic_fields.js @@ -30,7 +30,7 @@ var _t = core._t; var InputField = AbstractField.extend({ events: _.extend({}, AbstractField.prototype.events, { 'input': '_onInput', - 'focusout': '_onFocusout', + 'change': '_onChange', }), /** @@ -137,11 +137,12 @@ var InputField = AbstractField.extend({ //-------------------------------------------------------------------------- /** - * We immediately notify the outside world when this input loses focus. + * We immediately notify the outside world when this input confirms its + * changes. * * @private */ - _onFocusout: function () { + _onChange: function () { this._setValue(this.$input.val()); }, /** diff --git a/addons/web/static/test/views/form_tests.js b/addons/web/static/test/views/form_tests.js index 8eecfa1cb79..651819a7c37 100644 --- a/addons/web/static/test/views/form_tests.js +++ b/addons/web/static/test/views/form_tests.js @@ -790,7 +790,7 @@ QUnit.module('Views', { res_id: 1, mockRPC: function (route, args) { if (args.method === "onchange") { - assert.deepEqual(args.args[3], + assert.deepEqual(args.args[3], {"foo": "1", "p": "", "p.bar": "", "p.display_name": "", "p.product_id": "", "timmy": "", "timmy.name": ""}, "should send only the fields used in the views"); } @@ -2003,6 +2003,7 @@ QUnit.module('Views', { obj.int_field = obj.foo.length + 1000; }, }; + var def = $.Deferred(); var form = createView({ View: FormView, model: 'partner', @@ -2017,6 +2018,7 @@ QUnit.module('Views', { if (args.method === 'onchange') { onchangeNbr++; return concurrency.delay(3).then(function () { + def.resolve(); return result; }); } @@ -2031,16 +2033,16 @@ QUnit.module('Views', { form.$('input').first().val("12").trigger('input'); assert.strictEqual(onchangeNbr, 0, "no onchange has been called yet"); - return concurrency.delay(75).then(function () { + return waitForFinishedOnChange().then(function () { assert.strictEqual(onchangeNbr, 1, "one onchange has been called"); // add something in the input, then focus another input form.$('input').first().val("123").trigger('input'); - form.$('input').first().focusout(); + form.$('input').first().change(); assert.strictEqual(onchangeNbr, 2, "one onchange has been called immediately"); - return concurrency.delay(75); + return waitForFinishedOnChange(); }).then(function () { assert.strictEqual(onchangeNbr, 2, "no extra onchange should have been called"); @@ -2048,7 +2050,13 @@ QUnit.module('Views', { form.destroy(); done(); }); - }); + function waitForFinishedOnChange() { + return def.then(function () { + def = $.Deferred(); + return concurrency.delay(0); + }); + } + }); }); });