From 857de1b61ecaf2b89d091ab42f7b3ed2cfafe30b Mon Sep 17 00:00:00 2001 From: FrancoisGe Date: Tue, 12 Dec 2023 15:07:15 +0000 Subject: [PATCH] [FIX] web: history back from home menu Since PR odoo/odoo/pull/124068, the browser history back no longer works correctly when navigating from the home menu to applications. It requires two history backs instead of one. Why: Two pushStates are performed on the router, the first to add the menu_id and the second to apply the action associated with the menu. These two pushStates are not in the same setTimeout, which causes two changes to the url. So two entries in the browser history . Solution: We perform the two pushStates in the same setTimeout. This causes only one url modification and therefore one entry in the browser history. How to reproduce: - Go to the home menu - Click on the app A - Return to the home menu using the toggle menu - Click on the app B - Perform a history back - The home menu is displayed - Perform a history back Before this commit: The home menu is still displayed After this commit: The app A is displayed. closes odoo/odoo#146143 Enterprise: odoo/enterprise/52683 X-original-commit: 8e3152fbfbb4a836ab9663d009fbcacbe3554ae8 Related: odoo/enterprise#52697 Signed-off-by: Aaron Bohy (aab) Signed-off-by: Francois Georis (fge) --- .../src/webclient/menus/menu_service.js | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/addons/web/static/src/webclient/menus/menu_service.js b/addons/web/static/src/webclient/menus/menu_service.js index fffe374b7ae..d07884b2b71 100644 --- a/addons/web/static/src/webclient/menus/menu_service.js +++ b/addons/web/static/src/webclient/menus/menu_service.js @@ -25,6 +25,23 @@ function makeFetchLoadMenus() { function makeMenus(env, menusData, fetchLoadMenus) { let currentAppId; + function _getMenu(menuId) { + return menusData[menuId]; + } + function _updateURL(menuId) { + env.services.router.pushState({ menu_id: menuId }, { lock: true }); + } + function _setCurrentMenu(menu, updateURL = true) { + menu = typeof menu === "number" ? _getMenu(menu) : menu; + if (menu && menu.appID !== currentAppId) { + currentAppId = menu.appID; + env.bus.trigger("MENUS:APP-CHANGED"); + if (updateURL) { + _updateURL(menu.id); + } + } + } + return { getAll() { return Object.values(menusData); @@ -32,9 +49,7 @@ function makeMenus(env, menusData, fetchLoadMenus) { getApps() { return this.getMenu("root").children.map((mid) => this.getMenu(mid)); }, - getMenu(menuID) { - return menusData[menuID]; - }, + getMenu: _getMenu, getCurrentApp() { if (!currentAppId) { return; @@ -56,18 +71,12 @@ function makeMenus(env, menusData, fetchLoadMenus) { await env.services.action.doAction(menu.actionID, { clearBreadcrumbs: true, onActionReady: () => { - this.setCurrentMenu(menu); + _setCurrentMenu(menu, false); }, }); + _updateURL(menu.id); }, - setCurrentMenu(menu) { - menu = typeof menu === "number" ? this.getMenu(menu) : menu; - if (menu && menu.appID !== currentAppId) { - currentAppId = menu.appID; - env.bus.trigger("MENUS:APP-CHANGED"); - env.services.router.pushState({ menu_id: menu.id }, { lock: true }); - } - }, + setCurrentMenu: (menu) => _setCurrentMenu(menu), async reload() { if (fetchLoadMenus) { menusData = await fetchLoadMenus(true);