forked from EVOgeek/Vmeda.Online
		
	MOBILE-3922 menu: Fix select initial main menu page
This commit is contained in:
		
							parent
							
								
									2dea93a60f
								
							
						
					
					
						commit
						f53b783fc9
					
				| @ -35,7 +35,6 @@ function buildRoutes(injector: Injector): Routes { | ||||
|                 { | ||||
|                     path: '', | ||||
|                     pathMatch: 'full', | ||||
|                     redirectTo: CoreMainMenuHomeHandlerService.PAGE_NAME, | ||||
|                 }, | ||||
|                 { | ||||
|                     path: CoreMainMenuHomeHandlerService.PAGE_NAME, | ||||
|  | ||||
| @ -26,6 +26,7 @@ import { CoreCourseHelper } from '@features/course/services/course-helper'; | ||||
| import { CoreCourse } from '@features/course/services/course'; | ||||
| import { CoreContentLinksDelegate } from '@features/contentlinks/services/contentlinks-delegate'; | ||||
| import { CoreContentLinksHelper } from '@features/contentlinks/services/contentlinks-helper'; | ||||
| import { CoreMainMenuHomeHandlerService } from '@features/mainmenu/services/handlers/mainmenu'; | ||||
| 
 | ||||
| /** | ||||
|  * Page that displays the Home. | ||||
| @ -96,7 +97,7 @@ export class CoreMainMenuHomePage implements OnInit { | ||||
|             } | ||||
| 
 | ||||
|             return { | ||||
|                 page: `/main/home/${handler.page}`, | ||||
|                 page: `/main/${CoreMainMenuHomeHandlerService.PAGE_NAME}/${handler.page}`, | ||||
|                 pageParams: handler.pageParams, | ||||
|                 title: handler.title, | ||||
|                 class: handler.class, | ||||
|  | ||||
| @ -173,6 +173,10 @@ export class CoreMainMenuPage implements OnInit, OnDestroy { | ||||
| 
 | ||||
|         this.loaded = CoreMainMenuDelegate.areHandlersLoaded(); | ||||
| 
 | ||||
|         if (this.loaded && this.tabs[0] && !CoreNavigator.getCurrentMainMenuTab()) { | ||||
|             // No tab selected, select the first one.
 | ||||
|             this.mainTabs?.select(this.tabs[0].page); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | ||||
| @ -14,6 +14,7 @@ | ||||
| 
 | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { CanActivate, CanLoad, UrlTree } from '@angular/router'; | ||||
| import { CoreMainMenuHomeHandlerService } from '@features/mainmenu/services/handlers/mainmenu'; | ||||
| import { CoreApp } from '@services/app'; | ||||
| import { CoreRedirectPayload } from '@services/navigator'; | ||||
| import { CoreSites } from '@services/sites'; | ||||
| @ -59,7 +60,7 @@ export class CoreRedirectGuard implements CanLoad, CanActivate { | ||||
|                 redirect.page, | ||||
|                 redirect.options, | ||||
|             ); | ||||
|             const route = Router.parseUrl('/main/home'); | ||||
|             const route = Router.parseUrl(`/main/${CoreMainMenuHomeHandlerService.PAGE_NAME}`); | ||||
| 
 | ||||
|             route.queryParams = { | ||||
|                 redirectPath: redirect.page, | ||||
|  | ||||
| @ -20,7 +20,6 @@ import { NavigationOptions } from '@ionic/angular/providers/nav-controller'; | ||||
| import { CoreConstants } from '@/core/constants'; | ||||
| import { CoreDomUtils } from '@services/utils/dom'; | ||||
| import { CoreMainMenu } from '@features/mainmenu/services/mainmenu'; | ||||
| import { CoreMainMenuHomeHandlerService } from '@features/mainmenu/services/handlers/mainmenu'; | ||||
| import { CoreObject } from '@singletons/object'; | ||||
| import { CoreSites } from '@services/sites'; | ||||
| import { CoreUtils } from '@services/utils/utils'; | ||||
| @ -31,8 +30,8 @@ import { CoreScreen } from './screen'; | ||||
| import { CoreApp } from './app'; | ||||
| import { CoreSitePlugins } from '@features/siteplugins/services/siteplugins'; | ||||
| import { CoreError } from '@classes/errors/error'; | ||||
| 
 | ||||
| const DEFAULT_MAIN_MENU_TAB = CoreMainMenuHomeHandlerService.PAGE_NAME; | ||||
| import { CoreMainMenuDelegate } from '@features/mainmenu/services/mainmenu-delegate'; | ||||
| import { CoreMainMenuHomeHandlerService } from '@features/mainmenu/services/handlers/mainmenu'; | ||||
| 
 | ||||
| /** | ||||
|  * Redirect payload. | ||||
| @ -184,9 +183,12 @@ export class CoreNavigatorService { | ||||
|      * @return Whether navigation suceeded. | ||||
|      */ | ||||
|     async navigateToSiteHome(options: Omit<CoreNavigationOptions, 'reset'> & { siteId?: string } = {}): Promise<boolean> { | ||||
|         return this.navigateToSitePath(DEFAULT_MAIN_MENU_TAB, { | ||||
|         const landingPagePath = this.getLandingTabPage(); | ||||
| 
 | ||||
|         return this.navigateToSitePath(landingPagePath, { | ||||
|             ...options, | ||||
|             reset: true, | ||||
|             preferCurrentTab: false, | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
| @ -535,8 +537,13 @@ export class CoreNavigatorService { | ||||
|         path = path.replace(/^(\.|\/main)?\//, ''); | ||||
| 
 | ||||
|         const pathRoot = /^[^/]+/.exec(path)?.[0] ?? ''; | ||||
|         if (!pathRoot) { | ||||
|             // No path root, going to the site home.
 | ||||
|             return this.navigate('/main', options); | ||||
|         } | ||||
| 
 | ||||
|         const currentMainMenuTab = this.getCurrentMainMenuTab(); | ||||
|         const isMainMenuTab = pathRoot === currentMainMenuTab || (!currentMainMenuTab && path === DEFAULT_MAIN_MENU_TAB) || | ||||
|         const isMainMenuTab = pathRoot === currentMainMenuTab || (!currentMainMenuTab && path === this.getLandingTabPage()) || | ||||
|             await CoreUtils.ignoreErrors(CoreMainMenu.isMainMenuTab(pathRoot), false); | ||||
| 
 | ||||
|         if (!options.preferCurrentTab && isMainMenuTab) { | ||||
| @ -553,16 +560,32 @@ export class CoreNavigatorService { | ||||
|             return this.navigate(`/main/${path}`, options); | ||||
|         } | ||||
| 
 | ||||
|         // Open the path within the default main tab.
 | ||||
|         return this.navigate(`/main/${DEFAULT_MAIN_MENU_TAB}`, { | ||||
|         // Open the path within the home tab.
 | ||||
|         return this.navigate(`/main/${CoreMainMenuHomeHandlerService.PAGE_NAME}`, { | ||||
|             ...options, | ||||
|             params: { | ||||
|                 redirectPath: `/main/${DEFAULT_MAIN_MENU_TAB}/${path}`, | ||||
|                 redirectPath: `/main/${CoreMainMenuHomeHandlerService.PAGE_NAME}/${path}`, | ||||
|                 redirectOptions: options.params || options.nextNavigation ? options : undefined, | ||||
|             } as CoreRedirectPayload, | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Get the first page path using priority. | ||||
|      * | ||||
|      * @return Landing page path. | ||||
|      */ | ||||
|     protected getLandingTabPage(): string { | ||||
|         if (!CoreMainMenuDelegate.areHandlersLoaded()) { | ||||
|             // Handlers not loaded yet, landing page is the root page.
 | ||||
|             return ''; | ||||
|         } | ||||
| 
 | ||||
|         const handlers = CoreMainMenuDelegate.getHandlers(); | ||||
| 
 | ||||
|         return handlers[0]?.page || ''; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Replace all objects in query params with an ID that can be used to retrieve the object later. | ||||
|      * | ||||
|  | ||||
| @ -21,6 +21,7 @@ import { NavController, Router } from '@singletons'; | ||||
| import { ActivatedRoute, RouterState } from '@angular/router'; | ||||
| import { CoreSites } from '@services/sites'; | ||||
| import { CoreMainMenu } from '@features/mainmenu/services/mainmenu'; | ||||
| import { CoreMainMenuDelegate } from '@features/mainmenu/services/mainmenu-delegate'; | ||||
| 
 | ||||
| describe('CoreNavigator', () => { | ||||
| 
 | ||||
| @ -118,7 +119,7 @@ describe('CoreNavigator', () => { | ||||
|         }); | ||||
|     }); | ||||
| 
 | ||||
|     it('navigates to site paths ussing different path formats', async () => { | ||||
|     it('navigates to site paths using different path formats', async () => { | ||||
|         currentMainMenuHandlers.push('users'); | ||||
| 
 | ||||
|         const assertNavigation = async (currentPath, sitePath, expectedPath) => { | ||||
| @ -136,11 +137,23 @@ describe('CoreNavigator', () => { | ||||
|         await assertNavigation('/main/home', '/users/user/42', '/main/users/user/42'); | ||||
|     }); | ||||
| 
 | ||||
|     it('navigates to site home', async () => { | ||||
|     it('navigates to site home: no handlers loaded', async () => { | ||||
|         const success = await navigator.navigateToSiteHome(); | ||||
| 
 | ||||
|         expect(success).toBe(true); | ||||
|         expect(navControllerMock.navigateRoot).toHaveBeenCalledWith(['/main/home'], {}); | ||||
|         expect(navControllerMock.navigateRoot).toHaveBeenCalledWith(['/main'], {}); | ||||
|     }); | ||||
| 
 | ||||
|     it('navigates to site home: handlers loaded', async () => { | ||||
|         mockSingleton(CoreMainMenuDelegate, { | ||||
|             areHandlersLoaded: () => true, | ||||
|             getHandlers: () => [{ title: 'Test', page: 'initialpage', icon: '' }], | ||||
|         }); | ||||
| 
 | ||||
|         const success = await navigator.navigateToSiteHome(); | ||||
| 
 | ||||
|         expect(success).toBe(true); | ||||
|         expect(navControllerMock.navigateRoot).toHaveBeenCalledWith(['/main/initialpage'], {}); | ||||
|     }); | ||||
| 
 | ||||
|     it.todo('navigates to a different site'); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user