[FIX] web: kanban: always open dialog if quick create fails

Before this commit, when the user tried to quick create a record in
a grouped kanban view (by clicking on the "+" icon of a column, for
instance), and then clicked on the "Edit" button of the quick
create, if the name_create rpc failed, the webclient switched to
the form view and an error was displayed.

The displayed error was about a destroyed component trying to do an
rpc, namely the kanban controller. This is because it does 2 things
when the name_create failed: it opened the form view in a dialog
and it also switched to the form view. The latter was unwanted:
in case of errors, we don't want to switch to the form view but
rather to quick create from a dialog.

The error was actually caused by a small mistake: we use the
record variable to determine if the quick create succeeded and if
we can switch to the quick created record. However, that same
variable was already set before, for another purpose.

OPW 3620671

closes odoo/odoo#146141

X-original-commit: 01bc79051b22f41eff20d860327ed0e41b572cd4
Signed-off-by: Francois Georis (fge) <fge@odoo.com>
Signed-off-by: Aaron Bohy (aab) <aab@odoo.com>
This commit is contained in:
Aaron Bohy
2023-12-14 08:00:57 +00:00
parent 7a5cabe889
commit 64be692f7e
@@ -3946,6 +3946,68 @@ QUnit.module("Views", (hooks) => {
assert.containsOnce(target, ".o_kanban_quick_create:not(.o_disabled)");
});
QUnit.test("quick create record and click Edit, name_create fails", async (assert) => {
Object.assign(serverData, {
views: {
"partner,false,kanban": `
<kanban sample="1">
<field name="product_id"/>
<templates>
<t t-name="kanban-box">
<div><field name="name"/></div>
</t>
</templates>
</kanban>`,
"partner,false,search": "<search/>",
"partner,false,list": '<tree><field name="foo"/></tree>',
"partner,false,form": `<form>
<field name="product_id"/>
<field name="foo"/>
</form>`,
},
});
const webClient = await createWebClient({
serverData,
async mockRPC(route, args) {
if (args.method === "name_create") {
throw makeServerError({ message: "This is a user error" });
}
},
});
await doAction(webClient, {
res_model: "partner",
type: "ir.actions.act_window",
views: [
[false, "kanban"],
[false, "form"],
],
context: {
group_by: ["product_id"],
},
});
assert.containsN(target.querySelector(".o_kanban_group"), ".o_kanban_record", 2);
await quickCreateRecord(0);
assert.containsOnce(target.querySelector(".o_kanban_group"), ".o_kanban_quick_create");
await editQuickCreateInput("display_name", "test");
await editRecord();
assert.containsOnce(target, ".modal .o_form_view .o_form_editable");
assert.strictEqual(target.querySelector(".modal .o_field_many2one input").value, "hello");
// specify a name and save
await editInput(target, ".modal .o_field_widget[name=foo] input", "test");
await click(target, ".modal .o_form_button_save");
assert.containsNone(target, ".modal");
assert.containsN(target.querySelector(".o_kanban_group"), ".o_kanban_record", 3);
const firstRecord = target.querySelector(".o_kanban_group .o_kanban_record");
assert.strictEqual(firstRecord.innerText, "test");
assert.containsOnce(target, ".o_kanban_quick_create:not(.o_disabled)");
});
QUnit.test("quick create record is re-enabled after discard on failure", async (assert) => {
serverData.views["partner,false,form"] = `
<form>