diff --git a/addons/web/static/src/views/relational_model.js b/addons/web/static/src/views/relational_model.js
index 4cec0b3aafd..143623c5d93 100644
--- a/addons/web/static/src/views/relational_model.js
+++ b/addons/web/static/src/views/relational_model.js
@@ -2542,9 +2542,15 @@ export class DynamicGroupList extends DynamicList {
}
}
}
- const previousGroup = this.groups.find(
- (g) => !g.deleted && g.value === groupParams.value
- );
+ const groupValue = groupParams.__rawValue;
+ const previousGroup = this.groups.find((g) => {
+ if (g.deleted) {
+ return false;
+ }
+ return Array.isArray(g.__rawValue) && Array.isArray(groupValue)
+ ? g.__rawValue[0] === groupValue[0]
+ : g.__rawValue === groupValue;
+ });
const state = previousGroup ? previousGroup.exportState() : {};
return [groupParams, state];
});
diff --git a/addons/web/static/tests/views/kanban_view_tests.js b/addons/web/static/tests/views/kanban_view_tests.js
index ccf8df834e5..f7021c309b2 100644
--- a/addons/web/static/tests/views/kanban_view_tests.js
+++ b/addons/web/static/tests/views/kanban_view_tests.js
@@ -10668,6 +10668,59 @@ QUnit.module("Views", (hooks) => {
assert.containsN(target, ".o_kanban_record", 2);
});
+ QUnit.test(
+ "folded groups are kept when leaving and coming back (grouped by date)",
+ async (assert) => {
+ serverData.models.partner.fields.date.default = "2022-10-10";
+ serverData.models.partner.records[0].date = "2022-05-10";
+ serverData.views = {
+ "partner,false,kanban": `
+
+
+
+
+
+
+
+
+ `,
+ "partner,false,search": "",
+ "partner,false,form": "
",
+ };
+ const webClient = await createWebClient({ serverData });
+ await doAction(webClient, {
+ name: "Partners",
+ res_model: "partner",
+ type: "ir.actions.act_window",
+ views: [
+ [false, "kanban"],
+ [false, "form"],
+ ],
+ context: {
+ group_by: ["date"],
+ },
+ });
+
+ assert.containsOnce(target, ".o_kanban_view");
+ assert.containsN(target, ".o_kanban_group", 2);
+ assert.containsNone(target, ".o_column_folded");
+ assert.containsN(target, ".o_kanban_record", 4);
+
+ // fold the second column
+ const clickColumnAction = await toggleColumnActions(1);
+ await clickColumnAction("Fold");
+ assert.containsOnce(target, ".o_column_folded");
+ assert.containsOnce(target, ".o_kanban_record");
+
+ // open a record and go back
+ await click(target.querySelector(".o_kanban_record"));
+ assert.containsOnce(target, ".o_form_view");
+ await click(target.querySelector(".breadcrumb-item a"));
+ assert.containsOnce(target, ".o_column_folded");
+ assert.containsOnce(target, ".o_kanban_record");
+ }
+ );
+
QUnit.test("loaded records are kept when leaving and coming back", async (assert) => {
serverData.views = {
"partner,false,kanban": `
diff --git a/addons/web/static/tests/views/list_view_tests.js b/addons/web/static/tests/views/list_view_tests.js
index e4e993f8fe2..8a9c52ae1bc 100644
--- a/addons/web/static/tests/views/list_view_tests.js
+++ b/addons/web/static/tests/views/list_view_tests.js
@@ -15890,6 +15890,49 @@ QUnit.module("Views", (hooks) => {
assert.containsN(target, ".o_data_row", 3);
});
+ QUnit.test(
+ "open groups are kept when leaving and coming back (grouped by date)",
+ async (assert) => {
+ serverData.models.foo.fields.date.default = "2022-10-10";
+ serverData.views = {
+ "foo,false,list": ``,
+ "foo,false,search": "",
+ "foo,false,form": "",
+ };
+ const webClient = await createWebClient({ serverData });
+ await doAction(webClient, {
+ name: "Partners",
+ res_model: "foo",
+ type: "ir.actions.act_window",
+ views: [
+ [false, "list"],
+ [false, "form"],
+ ],
+ context: {
+ group_by: ["date"],
+ },
+ });
+
+ assert.containsOnce(target, ".o_list_view");
+ assert.containsN(target, ".o_group_header", 2);
+ assert.containsNone(target, ".o_group_open");
+ assert.containsNone(target, ".o_data_row");
+
+ // unfold the second group
+ await click(target.querySelectorAll(".o_group_header")[1]);
+ assert.containsOnce(target, ".o_group_open");
+ assert.containsN(target, ".o_data_row", 3);
+
+ // open a record and go back
+ await click(target.querySelector(".o_data_cell"));
+ assert.containsOnce(target, ".o_form_view");
+ await click(target.querySelector(".breadcrumb-item a"));
+
+ assert.containsOnce(target, ".o_group_open");
+ assert.containsN(target, ".o_data_row", 3);
+ }
+ );
+
QUnit.test(
"go to the next page after leaving and coming back to a grouped list view",
async (assert) => {