diff --git a/addons/web/static/src/model/relational_model/record.js b/addons/web/static/src/model/relational_model/record.js index c9b76a69c8a..795d3f2ebde 100644 --- a/addons/web/static/src/model/relational_model/record.js +++ b/addons/web/static/src/model/relational_model/record.js @@ -335,6 +335,11 @@ export class Record extends DataPoint { case "integer": case "monetary": continue; + case "html": + if (this._isRequired(fieldName) && this.data[fieldName].length === 0) { + unsetRequiredFields.push(fieldName); + } + break; case "one2many": case "many2many": { const list = this.data[fieldName]; diff --git a/addons/web/static/tests/views/fields/html_field_tests.js b/addons/web/static/tests/views/fields/html_field_tests.js index ef273e0c95c..336d4e41192 100644 --- a/addons/web/static/tests/views/fields/html_field_tests.js +++ b/addons/web/static/tests/views/fields/html_field_tests.js @@ -57,6 +57,32 @@ QUnit.module("Fields", ({ beforeEach }) => { assert.strictEqual(target.querySelector(".o_field_html").textContent, "some text"); }); + QUnit.test("html field with required attribute", async function (assert) { + await makeView({ + type: "form", + resModel: "partner", + resId: 1, + serverData, + arch: /* xml */ `
`, + }); + + const textarea = target.querySelector(".o_field_html textarea"); + assert.ok(textarea, "should have a text area"); + + await editInput(textarea, null, ""); + assert.strictEqual(textarea.value, ""); + + await clickSave(target); + assert.strictEqual( + target.querySelector(".o_notification_title").textContent, + "Invalid fields: " + ); + assert.strictEqual( + target.querySelector(".o_notification_content").innerHTML, + "" + ); + }); + QUnit.test("html fields are correctly rendered (edit)", async (assert) => { await makeView({ type: "form",