diff --git a/addons/web/static/src/js/views/form/form_controller.js b/addons/web/static/src/js/views/form/form_controller.js index 2cc52e4937b..a03623c1017 100644 --- a/addons/web/static/src/js/views/form/form_controller.js +++ b/addons/web/static/src/js/views/form/form_controller.js @@ -545,7 +545,11 @@ var FormController = BasicController.extend({ */ _onSave: function (ev) { ev.stopPropagation(); // Prevent x2m lines to be auto-saved - this.saveRecord(); + var self = this; + this._disableButtons(); + this.saveRecord().always(function () { + self._enableButtons(); + }); }, /** * This method is called when someone tries to sort a column, most likely diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js index 026a22c6798..ba2e8fe6a5b 100644 --- a/addons/web/static/tests/views/form_tests.js +++ b/addons/web/static/tests/views/form_tests.js @@ -1193,6 +1193,51 @@ QUnit.module('Views', { form.destroy(); }); + QUnit.test('disable buttons until reload data from server', function (assert) { + assert.expect(2); + var def; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
', + mockRPC: function (route, args) { + if (args.method === 'write') { + args.args[1].foo = "apple"; + } else if (args.method === 'read') { + // Block the 'read' call + var result = this._super.apply(this, arguments); + return $.when(def).then(_.constant(result)); + } + return this._super(route, args); + }, + res_id: 2, + }); + + var def = $.Deferred(); + form.$buttons.find('.o_form_button_edit').click(); + form.$('input').val("tralala").trigger('input'); + form.$buttons.find('.o_form_button_save').click(); + + // Save button should be disabled + assert.strictEqual( + form.$buttons.find('.o_form_button_save').attr('disabled'), + 'disabled', 'buttons should be disabled') + + // Release the 'read' call + def.resolve(); + + // Edit button should be enabled after the reload + assert.strictEqual( + form.$buttons.find('.o_form_button_edit').attr('disabled'), + undefined, 'buttons should be enabled') + + form.destroy(); + }); + QUnit.test('properly apply onchange in simple case', function (assert) { assert.expect(2);