diff --git a/addons/web/static/src/views/basic_relational_model.js b/addons/web/static/src/views/basic_relational_model.js index dc591f1424d..454f3896eba 100644 --- a/addons/web/static/src/views/basic_relational_model.js +++ b/addons/web/static/src/views/basic_relational_model.js @@ -1064,15 +1064,19 @@ export class StaticList extends DataPoint { this.model.__bm__.notifyChanges( parentID, { [this.__fieldName__]: op }, - { notifyChange: false } + { notifyChange: false, viewType: "form" } ); }) ); try { - await this.model.__bm__.notifyChanges(parentID, { - [this.__fieldName__]: lastOperation, - }); + await this.model.__bm__.notifyChanges( + parentID, + { + [this.__fieldName__]: lastOperation, + }, + { viewType: "form" } + ); } finally { if (this.__viewType === "list") { await this.model.__bm__.setSort(this.__bm_handle__, handleField); diff --git a/addons/web/static/tests/views/fields/one2many_field_tests.js b/addons/web/static/tests/views/fields/one2many_field_tests.js index b69cbe1dd72..72a6dae8fd3 100644 --- a/addons/web/static/tests/views/fields/one2many_field_tests.js +++ b/addons/web/static/tests/views/fields/one2many_field_tests.js @@ -397,6 +397,73 @@ QUnit.module("Fields", (hooks) => { await click(target, ".o_field_many2one input"); }); + QUnit.test("resequence a x2m in a form view dialog from another x2m", async function (assert) { + await makeView({ + type: "form", + resModel: "partner", + serverData, + resId: 1, + arch: ` +
+ + + + + + + + + + + + +
+ `, + mockRPC(route, args) { + assert.step(args.method); + if (args.method === "write") { + assert.deepEqual(Object.keys(args.args[1]), ["turtles"]); + assert.strictEqual(args.args[1].turtles.length, 1); + assert.deepEqual(args.args[1].turtles[0], [ + 1, + 2, + { + partner_ids: [ + [6, false, [2, 4]], + [1, 2, { int_field: 0 }], + [1, 4, { int_field: 1 }], + ], + }, + ]); + } + }, + }); + assert.verifySteps(["get_views", "read", "read"]); + + await click(target, ".o_data_cell"); + assert.containsOnce(target, ".modal"); + assert.deepEqual( + [...target.querySelectorAll(".modal [name='display_name']")].map( + (el) => el.textContent + ), + ["aaa", "second record"] + ); + assert.verifySteps(["read", "read"]); + + await dragAndDrop(".modal tr:nth-child(2) .o_handle_cell", "tbody tr", "top"); + assert.deepEqual( + [...target.querySelectorAll(".modal [name='display_name']")].map( + (el) => el.textContent + ), + ["second record", "aaa"] + ); + assert.verifySteps([]); + + await clickSave(target.querySelector(".modal")); + await clickSave(target); + assert.verifySteps(["write", "read", "read"]); + }); + QUnit.test("one2many list editable with cell readonly modifier", async function (assert) { assert.expect(3);