diff --git a/addons/web/static/src/views/list/list_renderer.js b/addons/web/static/src/views/list/list_renderer.js
index 12d8b047259..f306137eaa5 100644
--- a/addons/web/static/src/views/list/list_renderer.js
+++ b/addons/web/static/src/views/list/list_renderer.js
@@ -1029,7 +1029,7 @@ export class ListRenderer extends Component {
if (this.props.onOpenFormView) {
colspan++;
}
- return colspan
+ return colspan;
}
getGroupPagerProps(group) {
@@ -1037,7 +1037,7 @@ export class ListRenderer extends Component {
return {
offset: list.offset,
limit: list.limit,
- total: group.count,
+ total: list.isGrouped ? list.count : group.count,
onUpdate: async ({ offset, limit }) => {
await list.load({ limit, offset });
this.render(true);
@@ -1778,7 +1778,10 @@ export class ListRenderer extends Component {
}
showGroupPager(group) {
- return !group.isFolded && group.list.limit < group.count;
+ return (
+ !group.isFolded &&
+ group.list.limit < (group.list.isGrouped ? group.list.count : group.count)
+ );
}
/**
diff --git a/addons/web/static/tests/views/list_view_tests.js b/addons/web/static/tests/views/list_view_tests.js
index cdc111b166a..331e16c3e83 100644
--- a/addons/web/static/tests/views/list_view_tests.js
+++ b/addons/web/static/tests/views/list_view_tests.js
@@ -2159,11 +2159,12 @@ QUnit.module("Views", (hooks) => {
});
assert.strictEqual(
- target.querySelector(".o_group_header th").getAttribute("colspan"), "2"
+ target.querySelector(".o_group_header th").getAttribute("colspan"),
+ "2"
);
assert.strictEqual(
target.querySelector(".o_group_header th:last-child").getAttribute("colspan"),
- "2",
+ "2"
);
}
);
@@ -2186,11 +2187,12 @@ QUnit.module("Views", (hooks) => {
});
assert.strictEqual(
- target.querySelector(".o_group_header th").getAttribute("colspan"), "2"
+ target.querySelector(".o_group_header th").getAttribute("colspan"),
+ "2"
);
assert.strictEqual(
target.querySelector(".o_group_header th:last-child").getAttribute("colspan"),
- "1",
+ "1"
);
}
);
@@ -6808,6 +6810,23 @@ QUnit.module("Views", (hooks) => {
);
});
+ QUnit.test("multi-level grouped list, pager inside a group", async function (assert) {
+ serverData.models.foo.records.forEach((r) => (r.bar = true));
+ await makeView({
+ type: "list",
+ resModel: "foo",
+ serverData,
+ arch: '',
+ groupBy: ["bar", "foo"],
+ });
+
+ assert.containsOnce(target, ".o_group_header");
+
+ await click(target.querySelector(".o_group_header"));
+ assert.containsN(target, ".o_group_header", 4);
+ assert.containsNone(target, ".o_group_header:first-of-type .o_group_name .o_pager");
+ });
+
QUnit.test("count_limit attrs set in arch", async function (assert) {
let expectedCountLimit = 4;
await makeView({
@@ -11563,7 +11582,10 @@ QUnit.module("Views", (hooks) => {
`,
mockRPC(route, args) {
if (args.method === "write") {
- assert.deepEqual(args.args, [[1, 2], { date_start: "2021-04-01", date_end: "2017-01-26"}]);
+ assert.deepEqual(args.args, [
+ [1, 2],
+ { date_start: "2021-04-01", date_end: "2017-01-26" },
+ ]);
}
},
});
@@ -20025,36 +20047,39 @@ QUnit.module("Views", (hooks) => {
}
);
- QUnit.test("onchange should only be called once after pressing enter on a field", async function (assert) {
- serverData.models.foo.onchanges = {
- foo(record) {
- if (record.foo) {
- record.int_field = 1;
- }
- },
- };
- await makeView({
- type: "list",
- resModel: "foo",
- serverData,
- arch: `
+ QUnit.test(
+ "onchange should only be called once after pressing enter on a field",
+ async function (assert) {
+ serverData.models.foo.onchanges = {
+ foo(record) {
+ if (record.foo) {
+ record.int_field = 1;
+ }
+ },
+ };
+ await makeView({
+ type: "list",
+ resModel: "foo",
+ serverData,
+ arch: `
`,
- async mockRPC(_, { method }) {
- if (method === "onchange") {
- assert.step(method);
- }
- },
- });
- await click(target.querySelector(".o_data_cell"));
- target.querySelector(".o_field_widget[name=foo] input").value = "1";
- await triggerEvents(target, ".o_field_widget[name=foo] input", [
- ["keydown", { key: "Enter" }],
- ["change"],
- ]);
- await nextTick();
- assert.verifySteps(["onchange"], "There should only be one onchange call");
- });
+ async mockRPC(_, { method }) {
+ if (method === "onchange") {
+ assert.step(method);
+ }
+ },
+ });
+ await click(target.querySelector(".o_data_cell"));
+ target.querySelector(".o_field_widget[name=foo] input").value = "1";
+ await triggerEvents(target, ".o_field_widget[name=foo] input", [
+ ["keydown", { key: "Enter" }],
+ ["change"],
+ ]);
+ await nextTick();
+ assert.verifySteps(["onchange"], "There should only be one onchange call");
+ }
+ );
});