From 52e5a8d3e318d6415e170fa82c4ed8d9825897ab Mon Sep 17 00:00:00 2001 From: Liam DeBeasi Date: Wed, 10 Apr 2019 16:18:59 -0400 Subject: [PATCH] fix(angular): back button goes back to proper tab (#18005) fixes #17278 fixes #15216 --- .../directives/navigation/stack-controller.ts | 18 +++++++++++++++++- .../test/test-app/e2e/src/tabs.e2e-spec.ts | 19 +++++++++++++++++++ .../nested-outlet.component.html | 3 +++ .../app/tabs-tab2/tabs-tab2.component.html | 1 + 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/angular/src/directives/navigation/stack-controller.ts b/angular/src/directives/navigation/stack-controller.ts index 638f5f6bb3..0680278c31 100644 --- a/angular/src/directives/navigation/stack-controller.ts +++ b/angular/src/directives/navigation/stack-controller.ts @@ -101,7 +101,23 @@ export class StackController { return Promise.resolve(false); } const view = views[views.length - deep - 1]; - return this.navCtrl.navigateBack(view.url).then(() => true); + let url = view.url; + + const viewSavedData = view.savedData; + if (viewSavedData) { + const primaryOutlet = viewSavedData.get('primary'); + if ( + primaryOutlet && + primaryOutlet.route && + primaryOutlet.route._routerState && + primaryOutlet.route._routerState.snapshot && + primaryOutlet.route._routerState.snapshot.url + ) { + url = primaryOutlet.route._routerState.snapshot.url; + } + } + + return this.navCtrl.navigateBack(url).then(() => true); }); } diff --git a/angular/test/test-app/e2e/src/tabs.e2e-spec.ts b/angular/test/test-app/e2e/src/tabs.e2e-spec.ts index bdc0f6f8f4..7b5ec4a41d 100644 --- a/angular/test/test-app/e2e/src/tabs.e2e-spec.ts +++ b/angular/test/test-app/e2e/src/tabs.e2e-spec.ts @@ -130,6 +130,25 @@ describe('tabs', () => { expect(await tab.$('ion-back-button').isDisplayed()).toBe(false); }); }); + + describe('enter url - /tabs/contact/one', () => { + beforeEach(async () => { + await browser.get('/tabs/contact/one'); + }); + + it('should return to correct tab after going to page in different outlet', async () => { + const tab = await getSelectedTab(); + await tab.$('#goto-nested-page1').click(); + + await testStack('app-nested-outlet ion-router-outlet', ['app-nested-outlet-page']); + + const nestedOutlet = await element(by.css('app-nested-outlet')); + const backButton = await nestedOutlet.$('ion-back-button'); + await backButton.click(); + + await testTabTitle('Tab 2 - Page 1'); + }); + }) }); async function testState(count: number, tab: string) { diff --git a/angular/test/test-app/src/app/nested-outlet/nested-outlet.component.html b/angular/test/test-app/src/app/nested-outlet/nested-outlet.component.html index 336f1707d3..b7ba5be3d7 100644 --- a/angular/test/test-app/src/app/nested-outlet/nested-outlet.component.html +++ b/angular/test/test-app/src/app/nested-outlet/nested-outlet.component.html @@ -1,5 +1,8 @@ + + + NESTED OUTLET diff --git a/angular/test/test-app/src/app/tabs-tab2/tabs-tab2.component.html b/angular/test/test-app/src/app/tabs-tab2/tabs-tab2.component.html index 7aa589956f..a41bd4c7bd 100644 --- a/angular/test/test-app/src/app/tabs-tab2/tabs-tab2.component.html +++ b/angular/test/test-app/src/app/tabs-tab2/tabs-tab2.component.html @@ -9,5 +9,6 @@

Go to Tab 1 - Page 1 Go to Tab 1 - Page 2 + Go to nested