diff --git a/addons/web/static/src/views/list/list_arch_parser.js b/addons/web/static/src/views/list/list_arch_parser.js index 3a3662437d8..2d361f985d5 100644 --- a/addons/web/static/src/views/list/list_arch_parser.js +++ b/addons/web/static/src/views/list/list_arch_parser.js @@ -226,7 +226,8 @@ export class ListArchParser { }); if (!treeAttr.defaultOrder.length && handleField) { - treeAttr.defaultOrder = stringToOrderBy(handleField); + const handleFieldSort = `${handleField}, id`; + treeAttr.defaultOrder = stringToOrderBy(handleFieldSort); } return { 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 90eb8d5849e..ecb2986021c 100644 --- a/addons/web/static/tests/views/fields/one2many_field_tests.js +++ b/addons/web/static/tests/views/fields/one2many_field_tests.js @@ -2678,6 +2678,31 @@ QUnit.module("Fields", (hooks) => { ]); }); + QUnit.test("one2many list order with handle widget", async (assert) => { + await makeView({ + type: "form", + resModel: "partner", + serverData, + arch: ` +
`, + resId: 1, + mockRPC(route, args) { + if (args.method === "web_read") { + assert.step(`web_read`); + assert.strictEqual(args.kwargs.specification.p.order, "int_field ASC, id ASC"); + } + }, + }); + assert.verifySteps(["web_read"]); + }); + QUnit.test("one2many field when using the pager", async function (assert) { const ids = []; for (let i = 0; i < 45; i++) { diff --git a/addons/web/static/tests/views/list_view_tests.js b/addons/web/static/tests/views/list_view_tests.js index 314215cfdd8..7a488c02c63 100644 --- a/addons/web/static/tests/views/list_view_tests.js +++ b/addons/web/static/tests/views/list_view_tests.js @@ -10824,7 +10824,7 @@ QUnit.module("Views", (hooks) => { }); QUnit.test("list with handle widget", async function (assert) { - assert.expect(11); + assert.expect(13); await makeView({ type: "list", @@ -10836,6 +10836,9 @@ QUnit.module("Views", (hooks) => {