diff --git a/addons/web/static/src/core/browser/browser.js b/addons/web/static/src/core/browser/browser.js
index daeb3dd535e..1b083a30a01 100644
--- a/addons/web/static/src/core/browser/browser.js
+++ b/addons/web/static/src/core/browser/browser.js
@@ -85,8 +85,9 @@ export function makeRAMLocalStorage() {
let store = {};
return {
setItem(key, value) {
- store[key] = value;
- window.dispatchEvent(new StorageEvent("storage", { key, newValue: value }));
+ const newValue = String(value);
+ store[key] = newValue;
+ window.dispatchEvent(new StorageEvent("storage", { key, newValue }));
},
getItem(key) {
return store[key];
diff --git a/addons/web/static/src/views/list/list_renderer.js b/addons/web/static/src/views/list/list_renderer.js
index 42852e7c13d..d44ef288ce3 100644
--- a/addons/web/static/src/views/list/list_renderer.js
+++ b/addons/web/static/src/views/list/list_renderer.js
@@ -1017,11 +1017,12 @@ export class ListRenderer extends Component {
getOptionalActiveFields() {
this.optionalActiveFields = {};
- const optionalActiveFields = browser.localStorage.getItem(this.keyOptionalFields);
+ let optionalActiveFields = browser.localStorage.getItem(this.keyOptionalFields);
const optionalColumn = this.allColumns.filter(
(col) => col.type === "field" && col.optional
);
if (optionalActiveFields) {
+ optionalActiveFields = optionalActiveFields.split(",");
optionalColumn.forEach((col) => {
this.optionalActiveFields[col.name] = optionalActiveFields.includes(col.name);
});
diff --git a/addons/web/static/tests/views/list_view_tests.js b/addons/web/static/tests/views/list_view_tests.js
index 9efd245267d..b799eaf6205 100644
--- a/addons/web/static/tests/views/list_view_tests.js
+++ b/addons/web/static/tests/views/list_view_tests.js
@@ -15797,6 +15797,55 @@ QUnit.module("Views", (hooks) => {
}
);
+ QUnit.test("optional fields is shown only if enabled", async function (assert) {
+ serverData.actions = {
+ 1: {
+ id: 1,
+ name: "Currency Action 1",
+ res_model: "foo",
+ type: "ir.actions.act_window",
+ views: [[1, "list"]],
+ },
+ };
+
+ serverData.views = {
+ "foo,1,list": `
+
+
+
+ `,
+ "foo,false,search": "",
+ };
+
+ const webClient = await createWebClient({ serverData });
+ await doAction(webClient, 1);
+
+ assert.containsN(
+ target,
+ "th",
+ 4,
+ "should have 4 th, 1 for selector, 2 for columns, 1 for optional columns"
+ );
+
+ // disable optional field
+ await click(target, "table .o_optional_columns_dropdown .dropdown-toggle");
+ await click(target, "div.o_optional_columns_dropdown span.dropdown-item:first-child");
+ assert.containsN(
+ target,
+ "th",
+ 3,
+ "should have 3 th, 1 for selector, 1 for columns, 1 for optional columns"
+ );
+
+ await doAction(webClient, 1);
+ assert.containsN(
+ target,
+ "th",
+ 3,
+ "should have 3 th, 1 for selector, 1 for columns, 1 for optional columns ever after listview reload"
+ );
+ });
+
QUnit.test("selection is kept when optional fields are toggled", async function (assert) {
await makeView({
type: "list",
@@ -16039,10 +16088,10 @@ QUnit.module("Views", (hooks) => {
patchWithCleanup(browser.localStorage, {
getItem(key) {
assert.step("getItem " + key);
- return forceLocalStorage ? '["m2o"]' : super.getItem(arguments);
+ return forceLocalStorage ? "m2o" : super.getItem(arguments);
},
setItem(key, value) {
- assert.step("setItem " + key + " to " + JSON.stringify(value));
+ assert.step("setItem " + key + " to " + JSON.stringify(String(value)));
return super.setItem(arguments);
},
});
@@ -16100,7 +16149,7 @@ QUnit.module("Views", (hooks) => {
// Only a setItem since the list view maintains its own internal state of toggled
// optional columns.
- assert.verifySteps(["setItem " + localStorageKey + ' to ["m2o","reference"]']);
+ assert.verifySteps(["setItem " + localStorageKey + ' to "m2o,reference"']);
// 5 th (1 for checkbox, 3 for columns, 1 for optional columns)
assert.containsN(target, "th", 5, "should have 5 th");