From 19c2bbfa3a8b158d1c97b3a1e17180047303ae8a Mon Sep 17 00:00:00 2001 From: FrancoisGe Date: Thu, 28 Jul 2022 08:01:52 +0000 Subject: [PATCH] [FIX] web: KanbanView multi edit Before this commit, in a kanban view, if you try to create a new record while another one is being saved, then a crash is displayed. To avoid this problem, when we create a new record in quickCreate mode, we will first wait until the first one has finished saving before creating the new one. closes odoo/odoo#96826 Signed-off-by: Aaron Bohy (aab) --- .../kanban/kanban_record_quick_create.js | 3 + .../web/static/src/views/relational_model.js | 1 + .../static/tests/views/kanban_view_tests.js | 95 +++++++++++++++++++ 3 files changed, 99 insertions(+) diff --git a/addons/web/static/src/views/kanban/kanban_record_quick_create.js b/addons/web/static/src/views/kanban/kanban_record_quick_create.js index 2bf2d1912b4..bc5e52b3a5e 100644 --- a/addons/web/static/src/views/kanban/kanban_record_quick_create.js +++ b/addons/web/static/src/views/kanban/kanban_record_quick_create.js @@ -59,6 +59,9 @@ export class KanbanRecordQuickCreate extends Component { /** @param {boolean} force */ cancel(force) { + if (this.state.disabled) { + return; + } this.props.onCancel(force); } diff --git a/addons/web/static/src/views/relational_model.js b/addons/web/static/src/views/relational_model.js index 5a16e629311..84d558ce7ae 100644 --- a/addons/web/static/src/views/relational_model.js +++ b/addons/web/static/src/views/relational_model.js @@ -1831,6 +1831,7 @@ export class DynamicRecordList extends DynamicList { } async quickCreate(activeFields, context) { + await this.model.mutex.getUnlockedDef(); const record = this.quickCreateRecord; if (record) { this.removeRecord(record); diff --git a/addons/web/static/tests/views/kanban_view_tests.js b/addons/web/static/tests/views/kanban_view_tests.js index 7579a7d1447..0b86ef7a70d 100644 --- a/addons/web/static/tests/views/kanban_view_tests.js +++ b/addons/web/static/tests/views/kanban_view_tests.js @@ -2037,6 +2037,101 @@ QUnit.module("Views", (hooks) => { assert.verifySteps(["create"]); }); + QUnit.test( + "save a quick create record and create a new record at the same time", + async (assert) => { + const prom = makeDeferred(); + await makeView({ + type: "kanban", + resModel: "partner", + serverData, + arch: ` + + + + +
+ +
+
+
+
`, + groupBy: ["bar"], + async mockRPC(route, { method }) { + if (method === "name_create") { + assert.step("name_create"); + await prom; + } + }, + }); + + assert.containsN( + target, + ".o_kanban_record", + 4, + "should have 4 records at the beginning" + ); + + // Create and save a record + await quickCreateRecord(); + await editQuickCreateInput("display_name", "new partner"); + await validateRecord(); + assert.containsN( + target, + ".o_kanban_record", + 4, + "should not have created the record yet" + ); + assert.strictEqual( + target.querySelector(".o_kanban_quick_create [name=display_name] input").value, + "new partner", + "quick create should not be empty yet" + ); + assert.hasClass( + target.querySelector(".o_kanban_quick_create"), + "o_disabled", + "quick create should be disabled" + ); + + // Create a new record during the save of the first one + await createRecord(); + assert.containsN( + target, + ".o_kanban_record", + 4, + "should not have created the record yet" + ); + assert.strictEqual( + target.querySelector(".o_kanban_quick_create [name=display_name] input").value, + "new partner", + "quick create should not be empty yet" + ); + assert.hasClass( + target.querySelector(".o_kanban_quick_create"), + "o_disabled", + "quick create should be disabled" + ); + + prom.resolve(); + await nextTick(); + assert.containsN(target, ".o_kanban_record", 5, "should have created a new record"); + assert.strictEqual( + target.querySelector( + ".o_kanban_quick_create .o_field_widget[name=display_name] input" + ).value, + "", + "quick create should now be empty" + ); + assert.doesNotHaveClass( + target.querySelector(".o_kanban_quick_create"), + "o_disabled", + "quick create should be enabled" + ); + + assert.verifySteps(["name_create"]); + } + ); + QUnit.test( "quick create record: prevent multiple adds with ENTER, with onchange", async (assert) => {