diff --git a/addons/web/static/src/views/kanban/kanban_model.js b/addons/web/static/src/views/kanban/kanban_model.js index eb70e23896f..d563c7793ad 100644 --- a/addons/web/static/src/views/kanban/kanban_model.js +++ b/addons/web/static/src/views/kanban/kanban_model.js @@ -295,6 +295,20 @@ class KanbanGroup extends Group { await this.checkActiveValue(); } + async validateQuickCreate() { + const record = this.list.quickCreateRecord; + if (!record) { + return false; + } + const saved = await record.save(); + if (saved) { + this.addRecord(this.removeRecord(record), 0); + this.count++; + this.list.count++; + return record; + } + } + // ------------------------------------------------------------------------ // Protected // ------------------------------------------------------------------------ diff --git a/addons/web/static/src/views/relational_model.js b/addons/web/static/src/views/relational_model.js index a240f0fae78..f7578659e33 100644 --- a/addons/web/static/src/views/relational_model.js +++ b/addons/web/static/src/views/relational_model.js @@ -2542,22 +2542,6 @@ export class Group extends DataPoint { this.model.notify(); } - async validateQuickCreate() { - const record = this.list.quickCreateRecord; - if (!record) { - return false; - } - const saved = await record.save(); - if (saved) { - this.addRecord(this.removeRecord(record), 0); - this.count++; - this.list.count++; - return record; - } else { - this.removeRecord(record); - } - } - valueEquals(value) { return this.value instanceof DateTime ? this.value.equals(value) : this.value === value; } diff --git a/addons/web/static/tests/views/kanban_view_tests.js b/addons/web/static/tests/views/kanban_view_tests.js index bf9204c5f0e..934bf3a042e 100644 --- a/addons/web/static/tests/views/kanban_view_tests.js +++ b/addons/web/static/tests/views/kanban_view_tests.js @@ -1562,6 +1562,41 @@ QUnit.module("Views", (hooks) => { ]); }); + QUnit.test("quick create record validation: stays open when invalid", async (assert) => { + await makeView({ + type: "kanban", + resModel: "partner", + serverData, + arch: ` + + + +
+
+
+ `, + groupBy: ["bar"], + async mockRPC(route, { method }) { + assert.step(method || route); + }, + }); + assert.verifySteps(["get_views", "web_read_group", "web_search_read", "web_search_read"]); + + await createRecord(); + assert.verifySteps(["onchange"]); + + // do not fill anything and validate + await validateRecord(); + assert.verifySteps([]); + assert.containsOnce(target, ".o_kanban_group:first-child .o_kanban_quick_create"); + assert.hasClass(target.querySelector("[name=display_name]"), "o_field_invalid"); + assert.containsOnce(target, ".o_notification_manager .o_notification"); + assert.equal( + target.querySelector(".o_notification").textContent, + "Invalid fields: Display Name" + ); + }); + QUnit.test("quick create record with default values and onchanges", async (assert) => { serverData.models.partner.fields.int_field.default = 4; serverData.models.partner.onchanges = {