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");