From 255478acbd66f01daf32422636f09f2014ebc9f8 Mon Sep 17 00:00:00 2001 From: Martin Geubelle Date: Thu, 2 Nov 2017 16:00:58 +0100 Subject: [PATCH] [FIX] web: clear m2o input at creation cancel After entering a value in a many2one, if one clicks somewhere else, a popup is opened to suggest the user to create (or not) a new record with the entered value. Before this rev, closing this popup resulted in an unclear situation where the input was still set with the entered value but the new record hadn't been created. This commit fixes this by clearing the input value if the record is not created. See task#36055 --- .../static/src/js/fields/relational_fields.js | 30 +++++++++++++++- .../tests/fields/relational_fields_tests.js | 34 +++++++++++++++---- 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js index d7b4368036d..19f2728a3ae 100644 --- a/addons/web/static/src/js/fields/relational_fields.js +++ b/addons/web/static/src/js/fields/relational_fields.js @@ -46,7 +46,7 @@ var M2ODialog = Dialog.extend({ click: function () { if (this.$("input").val() !== ''){ this.trigger_up('quick_create', { value: this.$('input').val() }); - this.close(); + this.close(true); } else { this.$("input").focus(); } @@ -71,12 +71,30 @@ var M2ODialog = Dialog.extend({ this.$("p").text(_.str.sprintf(_t("You are creating a new %s, are you sure it does not exist yet?"), this.name)); this.$("input").val(this.value); }, + /** + * @override + * @param {boolean} isSet + */ + close: function (isSet) { + this.isSet = isSet; + this._super.apply(this, arguments); + }, + /** + * @override + */ + destroy: function () { + if (!this.isSet) { + this.trigger_up('closed_unset'); + } + this._super.apply(this, arguments); + }, }); var FieldMany2One = AbstractField.extend({ supportedFieldTypes: ['many2one'], template: 'FieldMany2One', custom_events: _.extend({}, AbstractField.prototype.custom_events, { + 'closed_unset': '_onDialogClosedUnset', 'quick_create': '_onQuickCreate', 'search_create_popup': '_onSearchCreatePopup', }), @@ -450,6 +468,16 @@ var FieldMany2One = AbstractField.extend({ }); } }, + + /** + * Reset the input as dialog has been closed without m2o creation. + * + * @private + */ + _onDialogClosedUnset: function () { + this.floating = false; + this._render(); + }, /** * @private */ diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js index 3cdd4b89138..07b58764e30 100644 --- a/addons/web/static/tests/fields/relational_fields_tests.js +++ b/addons/web/static/tests/fields/relational_fields_tests.js @@ -1395,7 +1395,7 @@ QUnit.module('relational_fields', { }); QUnit.test('slow create on a many2one', function (assert) { - assert.expect(1); + assert.expect(7); var form = createView({ View: FormView, @@ -1415,12 +1415,34 @@ QUnit.module('relational_fields', { }, }); + // cancel the many2one creation with Cancel button + form.$('.o_field_many2one input').focus().val('new product').trigger('keyup').trigger('blur'); + assert.strictEqual($('.modal').length, 1, "there should be one opened modal"); + $('.modal .modal-footer .btn:contains(Cancel)').click(); + assert.strictEqual(form.$('.o_field_many2one input').val(), "", + 'the many2one should not set a value as its creation has been cancelled (with Cancel button)'); + + // cancel the many2one creation with Close button + form.$('.o_field_many2one input').focus().val('new product').trigger('keyup').trigger('blur'); + $('.modal .modal-header button').click(); + assert.strictEqual(form.$('.o_field_many2one input').val(), "", + 'the many2one should not set a value as its creation has been cancelled (with Close button)'); + + // select a new value then cancel the creation of the new one --> restore the previous + form.$('.o_field_many2one input').click(); + form.$('.o_field_many2one input').autocomplete('widget').find('a').first().click(); + assert.strictEqual(form.$('input').val(), "xphone", "should have selected xphone"); + form.$('.o_field_many2one input').focus().val('new product').trigger('keyup').trigger('blur'); + assert.strictEqual($('.modal').length, 1, "there should be one opened modal"); + $('.modal .modal-footer .btn:contains(Cancel)').click(); + assert.strictEqual(form.$('.o_field_many2one input').val(), "xphone", + 'should have restored the many2one with its previous selected value (xphone)'); + + // confirm the many2one creation form.$('.o_field_many2one input').focus(); - form.$('.o_field_many2one input').val('new partner').trigger('keyup').trigger('focusout'); - - $('.modal .modal-footer .btn-primary').first().click(); - - assert.strictEqual($('.modal:visible:last .o_form_view').length, 1, + form.$('.o_field_many2one input').val('new partner').trigger('keyup').trigger('blur'); + $('.modal .modal-footer .btn-primary').click(); + assert.strictEqual($('.modal .o_form_view').length, 1, 'a new modal should be opened and contain a form view'); form.destroy();