[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) <aab@odoo.com>
Signed-off-by: Francois Georis (fge) <fge@odoo.com>
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user