diff --git a/addons/web/static/src/js/fields/signature.js b/addons/web/static/src/js/fields/signature.js index e2c4fc48836..6011cf7bf3f 100644 --- a/addons/web/static/src/js/fields/signature.js +++ b/addons/web/static/src/js/fields/signature.js @@ -116,6 +116,7 @@ var FieldBinarySignature = AbstractFieldBinary.extend({ fieldDependencies: _.extend({}, AbstractFieldBinary.prototype.fieldDependencies, { __last_update: {type: 'datetime'}, }), + resetOnAnyFieldChange: true, custom_events: _.extend({}, AbstractFieldBinary.prototype.custom_events, { upload_signature: '_onUploadSignature', }), @@ -231,18 +232,13 @@ var FieldBinarySignature = AbstractFieldBinary.extend({ }; if (this.nodeOptions.full_name) { - var $search = $("[name='" + this.nodeOptions.full_name + "']"); - // If full_name correspond to field in read-only mode - var signName = $($search).text(); - - // If full_name correspond to field to fill - if (!signName && $($search)[0]) { - signName = $($search)[0].value; - } - if (!signName) { - // If full_name is in the recordData. Last option because this value might not be the last value. - signName = this.recordData[this.nodeOptions.full_name] || ''; - } + var signName; + if (this.fields[this.nodeOptions.full_name].type === 'many2one') { + // If m2o is empty, it will have falsy value in recordData + signName = this.recordData[this.nodeOptions.full_name] && this.recordData[this.nodeOptions.full_name].data.display_name; + } else { + signName = this.recordData[this.nodeOptions.full_name]; + } nameAndSignatureOptions.defaultName = (signName === '') ? undefined : signName; } diff --git a/addons/web/static/tests/fields/signature.js b/addons/web/static/tests/fields/signature.js new file mode 100644 index 00000000000..43f9bf7b502 --- /dev/null +++ b/addons/web/static/tests/fields/signature.js @@ -0,0 +1,112 @@ +odoo.define('web.signature_field_tests', function (require) { +"use strict"; + +var FormView = require('web.FormView'); +var testUtils = require('web.test_utils'); + +var createView = testUtils.createView; + +QUnit.module('fields', {}, function () { + +QUnit.module('signature', { + beforeEach: function () { + this.data = { + partner: { + fields: { + display_name: {string: "Name", type: "char" }, + product_id: {string: "Product Name", type: "many2one", relation: 'product'}, + sign: {string: "Signature", type: "binary"}, + }, + records: [{ + id: 1, + display_name: "Pop's Chock'lit", + product_id: 7, + }], + onchanges: {}, + }, + product: { + fields: { + name: {string: "Product Name", type: "char"} + }, + records: [{ + id: 7, + display_name: "Veggie Burger", + }] + }, + }; + } +}, function () { + + QUnit.module('Signature Field'); + + QUnit.test('Set simple field in "full_name" node option', async function (assert) { + assert.expect(3); + + var form = await createView({ + View: FormView, + model: 'partner', + res_id: 1, + data: this.data, + arch: '
', + mockRPC: function (route, args) { + if (route === '/web/sign/get_fonts/') { + return Promise.resolve(); + } + return this._super(route, args); + }, + }); + + await testUtils.form.clickEdit(form); + + assert.containsOnce(form, 'div[name=sign] div.o_signature svg', + "should have a valid signature widget"); + // Click on the widget to open signature modal + await testUtils.dom.click(form.$('div[name=sign] div.o_signature')); + assert.strictEqual($('.modal .modal-body a.o_web_sign_auto_button').length, 1, + 'should open a modal with "Auto" button'); + assert.strictEqual($('.modal .modal-body .o_web_sign_name_input').val(), "Pop's Chock'lit", + 'Correct Value should be set in the input for auto drawing the signature'); + + form.destroy(); + }); + + QUnit.test('Set m2o field in "full_name" node option', async function (assert) { + assert.expect(3); + + var form = await createView({ + View: FormView, + model: 'partner', + res_id: 1, + data: this.data, + arch: '', + mockRPC: function (route, args) { + if (route === '/web/sign/get_fonts/') { + return Promise.resolve(); + } + return this._super(route, args); + }, + }); + + await testUtils.form.clickEdit(form); + + assert.containsOnce(form, 'div[name=sign] div.o_signature svg', + "should have a valid signature widget"); + // Click on the widget to open signature modal + await testUtils.dom.click(form.$('div[name=sign] div.o_signature')); + assert.strictEqual($('.modal .modal-body a.o_web_sign_auto_button').length, 1, + 'should open a modal with "Auto" button'); + assert.strictEqual($('.modal .modal-body .o_web_sign_name_input').val(), "Veggie Burger", + 'Correct Value should be set in the input for auto drawing the signature'); + + form.destroy(); + }); + +}); +}); +}); diff --git a/addons/web/views/webclient_templates.xml b/addons/web/views/webclient_templates.xml index 25f3e6ba5c9..22ddf28a6ce 100644 --- a/addons/web/views/webclient_templates.xml +++ b/addons/web/views/webclient_templates.xml @@ -556,6 +556,7 @@ +