diff --git a/addons/web/static/src/views/relational_model.js b/addons/web/static/src/views/relational_model.js index 925cb3c9d2a..c94619e304f 100644 --- a/addons/web/static/src/views/relational_model.js +++ b/addons/web/static/src/views/relational_model.js @@ -1792,6 +1792,13 @@ export class DynamicRecordList extends DynamicList { this.count = 0; } + exportState() { + return { + ...super.exportState(), + offset: this.offset, + }; + } + /** * Performs a search_count with the current domain to set the count. This is * useful as web_search_read limits the count for performance reasons, so it diff --git a/addons/web/static/tests/views/list_view_tests.js b/addons/web/static/tests/views/list_view_tests.js index 694f523842d..ae25d706407 100644 --- a/addons/web/static/tests/views/list_view_tests.js +++ b/addons/web/static/tests/views/list_view_tests.js @@ -4401,6 +4401,34 @@ QUnit.module("Views", (hooks) => { assert.strictEqual(target.querySelector(".o_pager_limit").innerText, "4"); }); + QUnit.test("list keeps offset on switchView", async (assert) => { + assert.expect(3); + serverData.views = { + "foo,false,search": ``, + "foo,99,list": ``, + "foo,100,form": `
`, + }; + + const offsets = [0, 1, 1]; + const mockRPC = async (route, args) => { + if (args.method === "web_search_read") { + assert.strictEqual(args.kwargs.offset, offsets.shift()); + } + }; + const wc = await createWebClient({ serverData, mockRPC }); + await doAction(wc, { + res_model: "foo", + type: "ir.actions.act_window", + views: [ + [99, "list"], + [100, "form"], + ], + }); + await click(target, ".o_pager_next"); + await click(target, ".o_data_cell"); + await click(target, ".o_back_button"); + }); + QUnit.test("can sort records when clicking on header", async function (assert) { serverData.models.foo.fields.foo.sortable = true;