From 2b80c8e64742e79c877473da7a333eeeee589007 Mon Sep 17 00:00:00 2001 From: Mathieu Duckerts-Antoine Date: Thu, 23 Nov 2023 11:15:45 +0000 Subject: [PATCH] [FIX] web: pivot: clear sortedKeys when pruning Due a typo, sortedKeys were not always cleared when pruning the new trees after an update. Consequently the method _getTableRows could be called on a inexisting sub tree. Here we simply fix the typo and a test. opw-3584675 closes odoo/odoo#143714 X-original-commit: 3fa2d6e418daa2b1fa0df3c8d1ca643fac4cbaa2 Signed-off-by: Julien Mougenot (jum) Signed-off-by: Mathieu Duckerts-Antoine (dam) --- .../web/static/src/views/pivot/pivot_model.js | 2 +- .../static/tests/views/pivot_view_tests.js | 42 ++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/views/pivot/pivot_model.js b/addons/web/static/src/views/pivot/pivot_model.js index e631e35c150..475ce5bb6da 100644 --- a/addons/web/static/src/views/pivot/pivot_model.js +++ b/addons/web/static/src/views/pivot/pivot_model.js @@ -1518,7 +1518,7 @@ export class PivotModel extends Model { const subTree = tree.directSubTrees.get(subTreeKey); if (!oldTree.directSubTrees.has(subTreeKey)) { subTree.directSubTrees.clear(); - delete subTreeKey.sortedKeys; + delete subTree.sortedKeys; } else { const oldSubTree = oldTree.directSubTrees.get(subTreeKey); this._pruneTree(subTree, oldSubTree); diff --git a/addons/web/static/tests/views/pivot_view_tests.js b/addons/web/static/tests/views/pivot_view_tests.js index 6060f329cc9..9847b304245 100644 --- a/addons/web/static/tests/views/pivot_view_tests.js +++ b/addons/web/static/tests/views/pivot_view_tests.js @@ -3678,7 +3678,7 @@ QUnit.module("Views", (hooks) => { '["Foo","Foo","Foo"]', // origin headers '["November 2016","December 2016","Variation","November 2016","December 2016"' + - ',"Variation","November 2016","December 2016","Variation"]', + ',"Variation","November 2016","December 2016","Variation"]', // number of 'measures' "1", // number of 'origins' @@ -5611,6 +5611,46 @@ QUnit.module("Views", (hooks) => { } ); + QUnit.test("filter -> sort -> unfilter should not crash", async function (assert) { + await makeView({ + type: "pivot", + resModel: "partner", + serverData, + arch: ` + + + + + `, + searchViewArch: ` + + + + `, + context: { + search_default_xphone: true, + }, + }); + + assert.deepEqual(getFacetTexts(target), ["xphone"]); + assert.deepEqual( + [...target.querySelectorAll("tbody th")].map((el) => el.innerText), + ["Total", "xphone", "Yes"] + ); + assert.strictEqual(getCurrentValues(target), ["1", "1", "1"].join()); + + await click(target, ".o_pivot_measure_row"); + await toggleSearchBarMenu(target); + await toggleMenuItem(target, "xphone"); + + assert.deepEqual(getFacetTexts(target), []); + assert.deepEqual( + [...target.querySelectorAll("tbody th")].map((el) => el.innerText), + ["Total", "xphone", "Yes", "xpad"] + ); + assert.strictEqual(getCurrentValues(target), ["4", "1", "1", "3"].join()); + }); + QUnit.test( "no class 'o_view_sample_data' when real data are presented", async function (assert) {