diff --git a/addons/web/static/src/webclient/actions/action_hook.js b/addons/web/static/src/webclient/actions/action_hook.js index 89688d27dbc..89b9305d875 100644 --- a/addons/web/static/src/webclient/actions/action_hook.js +++ b/addons/web/static/src/webclient/actions/action_hook.js @@ -118,7 +118,8 @@ export function useSetupAction(params = {}) { root: { left: rootRef.el.scrollLeft, top: rootRef.el.scrollTop }, }; } else { - const contentEl = rootRef.el.querySelector(".o_content"); + const contentEl = rootRef.el.querySelector(".o_component_with_search_panel > .o_renderer_with_searchpanel," + + ".o_component_with_search_panel > .o_renderer") || rootRef.el.querySelector(".o_content"); if (contentEl) { state[scrollSymbol] = { content: { left: contentEl.scrollLeft, top: contentEl.scrollTop }, @@ -138,7 +139,8 @@ export function useSetupAction(params = {}) { rootRef.el.scrollTop = (scrolling.root && scrolling.root.top) || 0; rootRef.el.scrollLeft = (scrolling.root && scrolling.root.left) || 0; } else if (scrolling.content) { - const contentEl = rootRef.el.querySelector(".o_content"); + const contentEl = rootRef.el.querySelector(".o_component_with_search_panel > .o_renderer_with_searchpanel," + + ".o_component_with_search_panel > .o_renderer") || rootRef.el.querySelector(".o_content"); if (contentEl) { contentEl.scrollTop = scrolling.content.top || 0; contentEl.scrollLeft = scrolling.content.left || 0; diff --git a/addons/web/static/tests/search/search_panel_tests.js b/addons/web/static/tests/search/search_panel_tests.js index 574feab656a..7faf94712e5 100644 --- a/addons/web/static/tests/search/search_panel_tests.js +++ b/addons/web/static/tests/search/search_panel_tests.js @@ -2268,6 +2268,34 @@ QUnit.module("Search", (hooks) => { } ); + QUnit.test("scroll kanban view with searchpanel and kept scroll position", async (assert) => { + for (let i = 10; i < 20; i++) { + serverData.models.category.records.push({ id: i, name: "Cat " + i }); + for (let j = 0; j <9; j++) + serverData.models.partner.records.push({ id: 100 + i*10 +j, foo: `Record ${i*10 +j}` }); + } + + const container = document.createElement("div"); + container.classList.add("o_web_client"); + container.style = "max-height: 300px"; + target.appendChild(container); + const webclient = await createWebClient({ target: container, serverData }); + + await doAction(webclient, 1); + await switchView(target, "kanban"); + + // simulate a scroll in the kanban view + target.querySelector(".o_renderer").scrollTop = 100; + await doAction(webclient, 2); + + // execute a second action (in which we don't scroll) + assert.strictEqual(target.querySelector(".o_content").scrollTop, 0); + + // go back using the breadcrumbs + await click(target.querySelector(".o_control_panel .breadcrumb a")); + assert.strictEqual(target.querySelector(".o_renderer").scrollTop, 100); + }); + QUnit.test("scroll position is kept when switching between controllers", async (assert) => { for (let i = 10; i < 20; i++) { serverData.models.category.records.push({ id: i, name: "Cat " + i });