From 3d3890a70d05f2d61942482900b53d56ea8de86d Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Tue, 10 Nov 2020 15:38:15 +0100 Subject: [PATCH] MOBILE-3585 mainmenu: Fix go to root when tab clicked --- .../privatefiles/services/handlers/mainmenu.ts | 1 + src/app/core/mainmenu/pages/menu/menu.page.ts | 16 ++++++++++++++-- .../core/mainmenu/services/handlers/mainmenu.ts | 1 + .../core/mainmenu/services/mainmenu.delegate.ts | 7 +++++++ src/app/services/utils/text.ts | 14 ++++++++++++++ 5 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/app/addon/privatefiles/services/handlers/mainmenu.ts b/src/app/addon/privatefiles/services/handlers/mainmenu.ts index a858b611e..61e8d6ce2 100644 --- a/src/app/addon/privatefiles/services/handlers/mainmenu.ts +++ b/src/app/addon/privatefiles/services/handlers/mainmenu.ts @@ -45,6 +45,7 @@ export class AddonPrivateFilesMainMenuHandler implements CoreMainMenuHandler { icon: 'fa-folder', title: 'addon.privatefiles.files', page: 'addon-privatefiles', + subPage: 'root', class: 'addon-privatefiles-handler', }; } diff --git a/src/app/core/mainmenu/pages/menu/menu.page.ts b/src/app/core/mainmenu/pages/menu/menu.page.ts index 48f6af306..68925539e 100644 --- a/src/app/core/mainmenu/pages/menu/menu.page.ts +++ b/src/app/core/mainmenu/pages/menu/menu.page.ts @@ -19,6 +19,7 @@ import { Subscription } from 'rxjs'; import { CoreApp } from '@services/app'; import { CoreSites } from '@services/sites'; +import { CoreTextUtils } from '@services/utils/text'; import { CoreEvents, CoreEventObserver, CoreEventLoadPageMainMenuData } from '@singletons/events'; import { CoreMainMenu } from '../../services/mainmenu'; import { CoreMainMenuDelegate, CoreMainMenuHandlerToDisplay } from '../../services/mainmenu.delegate'; @@ -242,8 +243,10 @@ export class CoreMainMenuPage implements OnInit, OnDestroy { return; } + const trimmedUrl = CoreTextUtils.instance.trimCharacter(this.router.url, '/'); + // Current tab was clicked. Check if user is already at root level. - if (this.router.url == '/mainmenu/' + page) { + if (trimmedUrl == CoreTextUtils.instance.trimCharacter(page, '/')) { // Already at root level, nothing to do. return; } @@ -255,8 +258,17 @@ export class CoreMainMenuPage implements OnInit, OnDestroy { try { const tab = this.tabs.find((tab) => tab.page == page); + // Use tab's subPage to check if user is already at root level. + if (tab?.subPage && trimmedUrl == + CoreTextUtils.instance.trimCharacter(CoreTextUtils.instance.concatenatePaths(tab.page, tab.subPage), '/')) { + // Already at root level, nothing to do. + return; + } + if (tab?.title) { - await CoreDomUtils.instance.showConfirm(Translate.instance.instant('core.confirmgotabroot', { name: tab.title })); + await CoreDomUtils.instance.showConfirm(Translate.instance.instant('core.confirmgotabroot', { + name: Translate.instance.instant(tab.title), + })); } else { await CoreDomUtils.instance.showConfirm(Translate.instance.instant('core.confirmgotabrootdefault')); } diff --git a/src/app/core/mainmenu/services/handlers/mainmenu.ts b/src/app/core/mainmenu/services/handlers/mainmenu.ts index 36a106e6a..3ca4bf6fd 100644 --- a/src/app/core/mainmenu/services/handlers/mainmenu.ts +++ b/src/app/core/mainmenu/services/handlers/mainmenu.ts @@ -55,6 +55,7 @@ export class CoreHomeMainMenuHandler implements CoreMainMenuHandler { icon: 'fa-home', title: 'core.mainmenu.home', page: 'home', + // @todo: subPage? The page can change due to core-tabs. class: 'core-home-handler', }; } diff --git a/src/app/core/mainmenu/services/mainmenu.delegate.ts b/src/app/core/mainmenu/services/mainmenu.delegate.ts index 2a0208749..e3847b168 100644 --- a/src/app/core/mainmenu/services/mainmenu.delegate.ts +++ b/src/app/core/mainmenu/services/mainmenu.delegate.ts @@ -32,6 +32,13 @@ export interface CoreMainMenuHandlerData { */ page: string; + /** + * Sub page loaded when the handler page is loaded. + * If your module performs a redirect when it's opened you need to specify the sub page in here. + * E.g. if page is 'foo' but it redirects to 'foo/bar' when opened, this value must be 'bar'. + */ + subPage?: string; + /** * Title to display for the handler. */ diff --git a/src/app/services/utils/text.ts b/src/app/services/utils/text.ts index cb96dd0e9..dcaf3c00f 100644 --- a/src/app/services/utils/text.ts +++ b/src/app/services/utils/text.ts @@ -891,6 +891,20 @@ export class CoreTextUtilsProvider { }); } + /** + * Remove all ocurrences of a certain character from the start and end of a string. + * + * @param text Text to treat. + * @param character Character to remove. + * @return Treated text. + */ + trimCharacter(text: string, character: string): string { + const escaped = this.escapeForRegex(character); + const regExp = new RegExp(`^${escaped}+|${escaped}+$`, 'g'); + + return text.replace(regExp, ''); + } + /** * If a number has only 1 digit, add a leading zero to it. *