From e23f0e1125fd533f0db8305ec61f2fb6f26dc07d Mon Sep 17 00:00:00 2001 From: "Hubert Van de Walle (huvw)" Date: Tue, 15 Nov 2022 08:58:58 +0000 Subject: [PATCH] [FIX] web: kanban: add a onPagerUpdate callback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use case: in the reconciliation widget, we need to know when the pager is updated before the next render because we need to select the appropriate id to use. cf the following PR: https://github.com/odoo/enterprise/pull/33631 opw-3031131 closes odoo/odoo#106581 X-original-commit: 19523b511d54278613a3d3e7389a51665dcc3fc1 Related: odoo/enterprise#34408 Signed-off-by: Georis François (fge) Signed-off-by: Hubert Van De Walle --- .../src/views/kanban/kanban_controller.js | 3 ++ .../static/tests/views/kanban_view_tests.js | 53 ++++++++++++++++++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/views/kanban/kanban_controller.js b/addons/web/static/src/views/kanban/kanban_controller.js index bd1d507628d..1e49920a127 100644 --- a/addons/web/static/src/views/kanban/kanban_controller.js +++ b/addons/web/static/src/views/kanban/kanban_controller.js @@ -65,6 +65,7 @@ export class KanbanController extends Component { this.model.root.offset = offset; this.model.root.limit = limit; await this.model.root.load(); + await this.onUpdatedPager(); this.render(true); // FIXME WOWL reactivity }, updateTotal: hasLimitedCount ? () => root.fetchCount() : undefined, @@ -118,6 +119,8 @@ export class KanbanController extends Component { async beforeExecuteActionButton(clickParams) {} async afterExecuteActionButton(clickParams) {} + + async onUpdatedPager() {} } KanbanController.template = `web.KanbanView`; diff --git a/addons/web/static/tests/views/kanban_view_tests.js b/addons/web/static/tests/views/kanban_view_tests.js index a2d5368d48c..510dbecf1b0 100644 --- a/addons/web/static/tests/views/kanban_view_tests.js +++ b/addons/web/static/tests/views/kanban_view_tests.js @@ -35,14 +35,16 @@ import { nbsp } from "@web/core/utils/strings"; import { getNextTabableElement } from "@web/core/utils/ui"; import { session } from "@web/session"; import { KanbanAnimatedNumber } from "@web/views/kanban/kanban_animated_number"; +import { KanbanController } from "@web/views/kanban/kanban_controller"; import { kanbanView } from "@web/views/kanban/kanban_view"; import { DynamicRecordList } from "@web/views/relational_model"; import { ViewButton } from "@web/views/view_button/view_button"; -import { Component, xml } from "@odoo/owl"; +import { Component, onWillRender, xml } from "@odoo/owl"; const serviceRegistry = registry.category("services"); const viewWidgetRegistry = registry.category("view_widgets"); +const viewRegistry = registry.category("views"); // ---------------------------------------------------------------------------- // Helpers @@ -1228,6 +1230,55 @@ QUnit.module("Views", (hooks) => { } ); + QUnit.test("pager, update calls onUpdatedPager before the render", async (assert) => { + assert.expect(8); + + class TestKanbanController extends KanbanController { + setup() { + super.setup(); + onWillRender(() => { + assert.step("render"); + }); + } + + async onUpdatedPager() { + assert.step("onUpdatedPager"); + } + } + + viewRegistry.add("test_kanban_view", { + ...kanbanView, + Controller: TestKanbanController, + }); + + await makeView({ + type: "kanban", + resModel: "partner", + serverData, + arch: ` + + + +
+
+
+
`, + limit: 3, + }); + + assert.deepEqual(getPagerValue(target), [1, 3]); + assert.strictEqual(getPagerLimit(target), 4); + assert.step("next page"); + await click(target.querySelector(".o_pager_next")); + assert.deepEqual(getPagerValue(target), [4, 4]); + assert.verifySteps([ + "render", + "next page", + "onUpdatedPager", + "render" + ]); + }); + QUnit.test("click on a button type='delete' to delete a record in a column", async (assert) => { await makeView({ type: "kanban",