diff --git a/addons/web/static/src/core/pager/pager.js b/addons/web/static/src/core/pager/pager.js index 3502201c437..a2dbf4e3621 100644 --- a/addons/web/static/src/core/pager/pager.js +++ b/addons/web/static/src/core/pager/pager.js @@ -113,6 +113,14 @@ export class Pager extends Component { this.state.isEditing = false; } + async updateTotal() { + if (!this.state.isDisabled) { + this.state.isDisabled = true; + await this.props.updateTotal(); + this.state.isDisabled = false; + } + } + /** * @param {MouseEvent} ev */ diff --git a/addons/web/static/src/core/pager/pager.xml b/addons/web/static/src/core/pager/pager.xml index 15bf0dff42d..c93c719a2f1 100644 --- a/addons/web/static/src/core/pager/pager.xml +++ b/addons/web/static/src/core/pager/pager.xml @@ -12,7 +12,7 @@ / - + + + diff --git a/addons/web/static/src/search/control_panel/control_panel.scss b/addons/web/static/src/search/control_panel/control_panel.scss index ee351727c60..543c76e9630 100644 --- a/addons/web/static/src/search/control_panel/control_panel.scss +++ b/addons/web/static/src/search/control_panel/control_panel.scss @@ -208,7 +208,7 @@ padding-left: 5px; text-align: center; user-select: none; - .o_pager_limit_fetch, .o_pager_value { + .o_pager_limit_fetch:not(.disabled), .o_pager_value { cursor: pointer; } } diff --git a/addons/web/static/tests/views/list_view_tests.js b/addons/web/static/tests/views/list_view_tests.js index 79cb61e63b1..0baebd5412e 100644 --- a/addons/web/static/tests/views/list_view_tests.js +++ b/addons/web/static/tests/views/list_view_tests.js @@ -5734,6 +5734,44 @@ QUnit.module("Views", (hooks) => { assert.verifySteps([]); }); + QUnit.test("pager, ungrouped, next and fetch count simultaneously", async function (assert) { + patchWithCleanup(DynamicRecordList, { WEB_SEARCH_READ_COUNT_LIMIT: 5 }); + serverData.models.foo.records.push({ id: 11, foo: "r11", bar: true }); + serverData.models.foo.records.push({ id: 12, foo: "r12", bar: true }); + serverData.models.foo.records.push({ id: 13, foo: "r13", bar: true }); + + let def; + await makeView({ + type: "list", + resModel: "foo", + serverData, + arch: '', + async mockRPC(route, args) { + assert.step(args.method); + if (args.method === "web_search_read") { + await def; + } + }, + }); + + assert.containsN(target, ".o_data_row", 2); + assert.strictEqual(target.querySelector(".o_pager_value").innerText, "1-2"); + assert.strictEqual(target.querySelector(".o_pager_limit").innerText, "5+"); + assert.verifySteps(["get_views", "web_search_read"]); + + def = makeDeferred(); + await click(target.querySelector(".o_pager_next")); // this request will be pending + assert.strictEqual(target.querySelector(".o_pager_value").innerText, "1-2"); + assert.strictEqual(target.querySelector(".o_pager_limit").innerText, "5+"); + // can't fetch count simultaneously as it is temporarily disabled while updating + assert.hasClass(target.querySelector(".o_pager_limit"), "disabled"); + assert.verifySteps(["web_search_read"]); + + def.resolve(); + await nextTick(); + assert.doesNotHaveClass(target.querySelector(".o_pager_limit"), "disabled"); + }); + QUnit.test("pager, grouped, with groups count limit reached", async function (assert) { patchWithCleanup(DynamicRecordList, { WEB_SEARCH_READ_COUNT_LIMIT: 3 }); serverData.models.foo.records.push({ id: 398, foo: "ozfijz" }); // to have 4 groups