diff --git a/addons/web/static/src/views/kanban/kanban_renderer.js b/addons/web/static/src/views/kanban/kanban_renderer.js index ad59cf0b8be..773a0f70f55 100644 --- a/addons/web/static/src/views/kanban/kanban_renderer.js +++ b/addons/web/static/src/views/kanban/kanban_renderer.js @@ -18,7 +18,7 @@ import { KanbanColumnQuickCreate } from "./kanban_column_quick_create"; import { KanbanRecord } from "./kanban_record"; import { KanbanRecordQuickCreate } from "./kanban_record_quick_create"; -import { Component, onWillDestroy, useRef, useState } from "@odoo/owl"; +import { Component, onWillDestroy, useRef, useState, onPatched, onWillPatch } from "@odoo/owl"; const DRAGGABLE_GROUP_TYPES = ["many2one"]; const MOVABLE_RECORD_TYPES = ["char", "boolean", "integer", "selection", "many2one"]; @@ -199,6 +199,14 @@ export class KanbanRenderer extends Component { useHotkey("ArrowDown", ({ area }) => this.focusNextCard(area, "down"), arrowsOptions); useHotkey("ArrowLeft", ({ area }) => this.focusNextCard(area, "left"), arrowsOptions); useHotkey("ArrowRight", ({ area }) => this.focusNextCard(area, "right"), arrowsOptions); + + let previousScrollTop = 0; + onWillPatch(() => { + previousScrollTop = this.rootRef.el.scrollTop; + }); + onPatched(() => { + this.rootRef.el.scrollTop = previousScrollTop; + }); } // ------------------------------------------------------------------------ diff --git a/addons/web/static/tests/views/kanban_view_tests.js b/addons/web/static/tests/views/kanban_view_tests.js index 82db9473e19..847c0386d94 100644 --- a/addons/web/static/tests/views/kanban_view_tests.js +++ b/addons/web/static/tests/views/kanban_view_tests.js @@ -13107,4 +13107,33 @@ QUnit.module("Views", (hooks) => { assert.verifySteps(["execute_action"]); } ); + + QUnit.test("Keep scrollTop when loading records with load more", async (assert) => { + await makeView({ + type: "kanban", + resModel: "partner", + serverData, + arch: ` + + +
+
+
+
`, + groupBy: ["bar"], + limit: 1, + }); + target.querySelector(".o_kanban_renderer").style.overflow = "scroll"; + target.querySelector(".o_kanban_renderer").style.height = "500px"; + const loadMoreButton = target.querySelector(".o_kanban_load_more button"); + loadMoreButton.scrollIntoView(); + const previousScrollTop = target.querySelector(".o_kanban_renderer").scrollTop; + await click(loadMoreButton); + assert.strictEqual( + previousScrollTop, + target.querySelector(".o_kanban_renderer").scrollTop, + "Should have the same scrollTop value" + ); + assert.notEqual(previousScrollTop, 0, "Should not have the scrollTop value at 0"); + }); });