diff --git a/addons/web/static/src/views/list/list_renderer.js b/addons/web/static/src/views/list/list_renderer.js
index c65ef06b865..7601c5d5270 100644
--- a/addons/web/static/src/views/list/list_renderer.js
+++ b/addons/web/static/src/views/list/list_renderer.js
@@ -497,13 +497,7 @@ export class ListRenderer extends Component {
const aggregates = {};
for (const fieldName in this.props.list.activeFields) {
const field = this.fields[fieldName];
- const fieldValues = [];
- for (const value of values) {
- const fieldValue = value[fieldName];
- if (fieldValue) {
- fieldValues.push(fieldValue);
- }
- }
+ const fieldValues = values.map((v) => v[fieldName]).filter((v) => v || v === 0);
if (!fieldValues.length) {
continue;
}
diff --git a/addons/web/static/tests/views/list_view_tests.js b/addons/web/static/tests/views/list_view_tests.js
index fcf0293be80..d3aeff61938 100644
--- a/addons/web/static/tests/views/list_view_tests.js
+++ b/addons/web/static/tests/views/list_view_tests.js
@@ -2865,11 +2865,24 @@ QUnit.module("Views", (hooks) => {
});
QUnit.test("aggregates are computed correctly", async function (assert) {
+ // map: foo record id -> qux value
+ const quxVals = { 1: 1.0, 2: 2.0, 3: 3.0, 4: 0 };
+
+ serverData.models.foo.records = serverData.models.foo.records.map((r) => ({
+ ...r,
+ qux: quxVals[r.id],
+ }));
+
await makeView({
type: "list",
resModel: "foo",
serverData,
- arch: '',
+ arch: /*xml*/ `
+
+
+
+
+ `,
searchViewArch: `
@@ -2878,23 +2891,23 @@ QUnit.module("Views", (hooks) => {
const tbodySelectors = target.querySelectorAll("tbody .o_list_record_selector input");
const theadSelector = target.querySelector("thead .o_list_record_selector input");
- assert.strictEqual(target.querySelectorAll("tfoot td")[2].innerText, "32");
+ const getFooterTextArray = () => {
+ return [...target.querySelectorAll("tfoot td")].map((td) => td.innerText);
+ };
+
+ assert.deepEqual(getFooterTextArray(), ["", "", "32", "1.50"]);
await click(tbodySelectors[0]);
await click(tbodySelectors[3]);
- assert.strictEqual(target.querySelectorAll("tfoot td")[2].innerText, "6");
+ assert.deepEqual(getFooterTextArray(), ["", "", "6", "0.50"]);
await click(theadSelector);
- assert.strictEqual(target.querySelectorAll("tfoot td")[2].innerText, "32");
+ assert.deepEqual(getFooterTextArray(), ["", "", "32", "1.50"]);
// Let's update the view to dislay NO records
await toggleFilterMenu(target);
await toggleMenuItem(target, "My Filter");
- assert.strictEqual(
- target.querySelectorAll("tfoot td")[2].innerText,
- "",
- "No records, so no total."
- );
+ assert.deepEqual(getFooterTextArray(), ["", "", "", ""]);
});
QUnit.test("aggregates are computed correctly in grouped lists", async function (assert) {