diff --git a/addons/web/static/src/views/relational_model.js b/addons/web/static/src/views/relational_model.js index 69d273ff81fd0e2bffbe727cd2887563b43e60b6..56d99e66cde188464de8d37ec261c08b173e7d8f 100644 --- a/addons/web/static/src/views/relational_model.js +++ b/addons/web/static/src/views/relational_model.js @@ -10,6 +10,7 @@ import { serializeDate, serializeDateTime, } from "@web/core/l10n/dates"; +import { RPCError } from "@web/core/network/rpc_service"; import { ORM, x2ManyCommands } from "@web/core/orm_service"; import { evaluateExpr } from "@web/core/py_js/py"; import { registry } from "@web/core/registry"; @@ -1664,8 +1665,14 @@ class DynamicList extends DataPoint { await Promise.all(validSelection.map((record) => record.load())); record.switchMode("readonly"); this.model.notify(); - } catch (_) { + } catch (e) { record.discard(); + const errorMessage = e instanceof RPCError ? e.data.message : e.message; + const errorTitle = e instanceof RPCError ? e.message : this.model.env._t("Error"); + this.model.notificationService.add(errorMessage, { + title: errorTitle, + type: "danger", + }); } validSelection.forEach((record) => { record.selected = false; diff --git a/addons/web/static/tests/views/list_view_tests.js b/addons/web/static/tests/views/list_view_tests.js index 11d5b5c99c0f6dcafc91d237d589b9b7eda5c832..8e30954cff9a8583126fc538cd54e272096a3892 100644 --- a/addons/web/static/tests/views/list_view_tests.js +++ b/addons/web/static/tests/views/list_view_tests.js @@ -11292,17 +11292,23 @@ QUnit.module("Views", (hooks) => { }); QUnit.test("editable list view: multi edition server error handling", async function (assert) { - await makeView({ + const list = await makeView({ type: "list", resModel: "foo", serverData, arch: '<tree multi_edit="1"><field name="foo" required="1"/></tree>', mockRPC(route, args) { if (args.method === "write") { - return Promise.reject(); + return Promise.reject({ message: "Odoo Server Error" }); } }, }); + patchWithCleanup(list.env.services.notification, { + add: (message) => { + assert.equal(message, "Odoo Server Error"); + assert.step("Error"); + }, + }); // select two records const rows = target.querySelectorAll(".o_data_row"); @@ -11313,7 +11319,9 @@ QUnit.module("Views", (hooks) => { await click(rows[0].querySelector(".o_data_cell")); await editInput(target, ".o_selected_row [name=foo] input", "abc"); await click(target, ".o_list_view"); + assert.verifySteps([]); await click(target, ".modal .btn-primary"); + assert.verifySteps(["Error"]); // Server error: if there was a crash manager, there would be an open error at this point... assert.strictEqual( $(target).find(".o_data_row:eq(0) .o_data_cell").text(),