summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Yelizariev <iel@odoo.com>2021-01-06 13:53:23 +0000
committerLucas Perais (lpe) <lpe@odoo.com>2021-02-08 10:04:46 +0000
commit17e4420f9ba2743d6ef454c01ca4e12617b2c8c1 (patch)
treee2fd3300fa1ab6393835fa7841e6e9f0e2fa311e
parent4fda4838b8e3462b6428f316bfe9814cd743e891 (diff)
[FIX] web: fix duplication on phone+sms button rerendering
STEPS: * Add related phone field to a form (e.g. partner_id.phone to sale.order form) * Use widget "phone" + activate sms feature * Create a record * Click edit, select partner that has phone specified (e.g. +1 234), edit partner's phone (e.g. +1 234 555), save BEFORE: ``+1 234 []SMS`` is converted to ``+1 234 555 +1 234 555`` AFTER: ``+1 234 555 []SMS`` WHY: * FieldPhone is inherited from FieldEmail https://github.com/odoo/odoo/blob/0de069b8ca9fb005ba5b076984f5677de25889ee/addons/web/static/src/js/fields/basic_fields.js#L1549 * sms module adds SMS button to ``$el`` https://github.com/odoo/odoo/blob/0de069b8ca9fb005ba5b076984f5677de25889ee/addons/sms/static/src/js/fields_phone_widget.js#L91 * So this commit filters ``$el`` before updating it --- opw-2425949 closes odoo/odoo#64156 Signed-off-by: Lucas Perais (lpe) <lpe@odoo.com>
-rw-r--r--addons/sms/static/tests/sms_widget_test.js50
-rw-r--r--addons/web/static/src/js/fields/basic_fields.js4
2 files changed, 53 insertions, 1 deletions
diff --git a/addons/sms/static/tests/sms_widget_test.js b/addons/sms/static/tests/sms_widget_test.js
index 467cd0770de..3da34dcd481 100644
--- a/addons/sms/static/tests/sms_widget_test.js
+++ b/addons/sms/static/tests/sms_widget_test.js
@@ -15,11 +15,13 @@ QUnit.module('fields', {
fields: {
message: {string: "message", type: "text"},
foo: {string: "Foo", type: "char", default: "My little Foo Value"},
+ mobile: {string: "mobile", type: "text"},
},
records: [{
id: 1,
message: "",
foo: 'yop',
+ mobile: "+32494444444",
}, {
id: 2,
message: "",
@@ -175,5 +177,53 @@ QUnit.module('fields', {
list.destroy();
});
+
+ QUnit.test('readonly sms phone field is properly rerendered after been changed by onchange', async function (assert) {
+ assert.expect(4);
+
+ const NEW_PHONE = '+32595555555';
+
+ const form = await createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form string="Partners">' +
+ '<sheet>' +
+ '<group>' +
+ '<field name="foo" on_change="1"/>' + // onchange to update mobile in readonly mode directly
+ '<field name="mobile" widget="phone" readonly="1"/>' + // readonly only, we don't want to go through write mode
+ '</group>' +
+ '</sheet>' +
+ '</form>',
+ res_id: 1,
+ viewOptions: {mode: 'edit'},
+ mockRPC: function (route, args) {
+ if (args.method === 'onchange') {
+ return Promise.resolve({
+ value: {
+ mobile: NEW_PHONE, // onchange to update mobile in readonly mode directly
+ },
+ });
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+ // check initial rendering
+ assert.strictEqual(form.$('.o_field_phone').text(), "+32494444444",
+ 'Initial Phone text should be set');
+ assert.strictEqual(form.$('.o_field_phone_sms').text(), 'SMS',
+ 'SMS button label should be rendered');
+
+ // trigger the onchange to update phone field, but still in readonly mode
+ await testUtils.fields.editInput($('input[name="foo"]'), 'someOtherFoo');
+
+ // check rendering after changes
+ assert.strictEqual(form.$('.o_field_phone').text(), NEW_PHONE,
+ 'Phone text should be updated');
+ assert.strictEqual(form.$('.o_field_phone_sms').text(), 'SMS',
+ 'SMS button label should not be changed');
+
+ form.destroy();
+ });
});
});
diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js
index 99e65b444c5..1b495696808 100644
--- a/addons/web/static/src/js/fields/basic_fields.js
+++ b/addons/web/static/src/js/fields/basic_fields.js
@@ -1509,7 +1509,9 @@ var FieldEmail = InputField.extend({
*/
_renderReadonly: function () {
if (this.value) {
- this.$el.text(this.value)
+ // Odoo legacy widgets can have multiple nodes inside their $el JQuery object
+ // so, select the proper one (other nodes are assumed not to contain proper data)
+ this.$el.closest("." + this.className).text(this.value)
.addClass('o_form_uri o_text_overflow')
.attr('href', this.prefix + ':' + this.value);
} else {