diff --git a/packages/vue-router/src/router.ts b/packages/vue-router/src/router.ts index 1445bb4417..edae1b90eb 100644 --- a/packages/vue-router/src/router.ts +++ b/packages/vue-router/src/router.ts @@ -219,13 +219,13 @@ export const createIonRouter = (opts: IonicVueRouterOptions, router: Router) => const changeTab = (tab: string, path: string) => { const routeInfo = locationHistory.getCurrentRouteInfoForTab(tab); - // TODO search const [pathname] = path.split('?'); if (routeInfo) { incomingRouteParams = Object.assign(Object.assign({}, routeInfo), { routerAction: 'push', routerDirection: 'none' }); - router.push(routeInfo.pathname + (routeInfo.search || '')); + const search = (routeInfo.search) ? `?${routeInfo.search}` : ''; + router.push(routeInfo.pathname + search); } else { handleNavigate(pathname, 'push', 'none', undefined, tab); diff --git a/packages/vue/src/components/IonRouterOutlet.ts b/packages/vue/src/components/IonRouterOutlet.ts index cea80cc3d1..bd16d33c1c 100644 --- a/packages/vue/src/components/IonRouterOutlet.ts +++ b/packages/vue/src/components/IonRouterOutlet.ts @@ -153,6 +153,8 @@ export const IonRouterOutlet = defineComponent({ const enteringViewItem = viewStacks.findViewItemByRouteInfo(routeInfo, id); const leavingViewItem = viewStacks.findLeavingViewItemByRouteInfo(routeInfo, id); + if (enteringViewItem === leavingViewItem) return; + fireLifecycle(enteringViewItem.vueComponent, LIFECYCLE_WILL_ENTER); if (leavingViewItem) { diff --git a/packages/vue/test-app/cypress.json b/packages/vue/test-app/cypress.json index 256174e33f..8ef00134d0 100644 --- a/packages/vue/test-app/cypress.json +++ b/packages/vue/test-app/cypress.json @@ -1,5 +1,6 @@ { "pluginsFile": "tests/e2e/plugins/index.js", "includeShadowDom": true, - "video": false + "video": false, + "screenshotOnRunFailure": false } diff --git a/packages/vue/test-app/package-lock.json b/packages/vue/test-app/package-lock.json index 386597a391..fe7d7b07c5 100644 --- a/packages/vue/test-app/package-lock.json +++ b/packages/vue/test-app/package-lock.json @@ -1306,27 +1306,27 @@ } }, "@ionic/core": { - "version": "0.6.0-dev.202009301514.ea201ea", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-0.6.0-dev.202009301514.ea201ea.tgz", - "integrity": "sha512-9nfu74LNxQ2b/Jg+kkXkD1OW+emDpLCqj/IvgPC+54jxjGDoiBbCiO7+dNhLFGUqMbU2Y1tkTR8etpLMV8CUEQ==", + "version": "0.6.0-dev.202010051922.f5d657c", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-0.6.0-dev.202010051922.f5d657c.tgz", + "integrity": "sha512-sIwN9lV4Fep+vTYfeso+D4BL6APKiYuQ6J2H5+0pV0Azep59TwOompR/SB9U3AYsHKMD+MQj9i2cxYFXIPtd3Q==", "requires": { "ionicons": "^5.1.2", "tslib": "^1.10.0" } }, "@ionic/vue": { - "version": "0.6.0-dev.202009301514.ea201ea", - "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-0.6.0-dev.202009301514.ea201ea.tgz", - "integrity": "sha512-RrOE0tlXONA1jbnVyqk42G6K04DuuXs8oCjo1FlCSJoBMj2lijENVnkbGp8ji/TcpxYSxFCqwYSIALu6DH1kpw==", + "version": "0.6.0-dev.202010051922.f5d657c", + "resolved": "https://registry.npmjs.org/@ionic/vue/-/vue-0.6.0-dev.202010051922.f5d657c.tgz", + "integrity": "sha512-HuMk3JUqt8DkVbgJYWgmmB+G5kALUoABl8n6fSFwFk8+vzqF0mJMoHcyspbL2hCGviTjHKQ9R2/WAbdq0Q/fNQ==", "requires": { - "@ionic/core": "0.6.0-dev.202009301514.ea201ea", + "@ionic/core": "0.6.0-dev.202010051922.f5d657c", "ionicons": "^5.1.2" } }, "@ionic/vue-router": { - "version": "0.6.0-dev.202009301514.ea201ea", - "resolved": "https://registry.npmjs.org/@ionic/vue-router/-/vue-router-0.6.0-dev.202009301514.ea201ea.tgz", - "integrity": "sha512-lt1RHiKRVr/2e35cJoaOKix92MKnNhQGXRZ4i/9DY7IXWPz+KwMFY2qba4wg5OmhWzZg3K7weStsv8LQH0/y1g==" + "version": "0.6.0-dev.202010051922.f5d657c", + "resolved": "https://registry.npmjs.org/@ionic/vue-router/-/vue-router-0.6.0-dev.202010051922.f5d657c.tgz", + "integrity": "sha512-524eNmjFuEJh3OpuLBZXd1+k3R4/jruNxLt53Ro/Ux8SsI4FgPgm/Igv8SRjd1knvx9LFN+nlA8JTdHNB58SrA==" }, "@jest/console": { "version": "24.9.0", @@ -7643,21 +7643,6 @@ "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", "dev": true }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, "eventemitter2": { "version": "6.4.3", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.3.tgz", @@ -8362,12 +8347,6 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -11232,12 +11211,6 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true - }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -12412,15 +12385,6 @@ } } }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, "pbkdf2": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", @@ -13304,15 +13268,6 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "ps-tree": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", - "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", - "dev": true, - "requires": { - "event-stream": "=3.3.4" - } - }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -14604,15 +14559,6 @@ } } }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "dev": true, - "requires": { - "through": "2" - } - }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -14672,127 +14618,6 @@ "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", "dev": true }, - "start-server-and-test": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.11.5.tgz", - "integrity": "sha512-XUGifPzbJcgD6tqWMFvbxnra1KByRuiw6Oc9FHR3tPm7UxB70a4iFDIuXfOAFtMJLvOJuwB3gnMUZxko8gtLow==", - "dev": true, - "requires": { - "bluebird": "3.7.2", - "check-more-types": "2.24.0", - "debug": "4.2.0", - "execa": "3.4.0", - "lazy-ass": "1.6.0", - "ps-tree": "1.2.0", - "wait-on": "5.2.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -14836,15 +14661,6 @@ "readable-stream": "^2.0.2" } }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, - "requires": { - "duplexer": "~0.1.1" - } - }, "stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", diff --git a/packages/vue/test-app/package.json b/packages/vue/test-app/package.json index 894be4d7c2..71238b729c 100644 --- a/packages/vue/test-app/package.json +++ b/packages/vue/test-app/package.json @@ -11,8 +11,8 @@ "cypress": "node_modules/.bin/cypress run --headless --browser chrome" }, "dependencies": { - "@ionic/vue": "^0.6.0-dev.202009301514.ea201ea", - "@ionic/vue-router": "^0.6.0-dev.202009301514.ea201ea", + "@ionic/vue": "0.6.0-dev.202010051922.f5d657c", + "@ionic/vue-router": "0.6.0-dev.202010051922.f5d657c", "core-js": "^3.6.5", "vue": "^3.0.0-0", "vue-router": "^4.0.0-0" diff --git a/packages/vue/test-app/src/views/Navigation.vue b/packages/vue/test-app/src/views/Navigation.vue index 96d53a39ba..3ff1677b1e 100644 --- a/packages/vue/test-app/src/views/Navigation.vue +++ b/packages/vue/test-app/src/views/Navigation.vue @@ -3,7 +3,7 @@ - + Navigation @@ -16,9 +16,9 @@ -
- On iOS mode, swipe to go back. -
+ + Set Route Parameters + @@ -29,11 +29,14 @@ import { IonButtons, IonContent, IonHeader, + IonItem, + IonLabel, IonPage, IonTitle, IonToolbar } from '@ionic/vue'; import { defineComponent } from 'vue'; +import { useRouter } from 'vue-router'; export default defineComponent({ name: 'Navigation', @@ -42,9 +45,23 @@ export default defineComponent({ IonButtons, IonContent, IonHeader, + IonItem, + IonLabel, IonPage, IonTitle, IonToolbar + }, + setup() { + const router = useRouter(); + const setRouteParams = () => { + router.push({ + query: { + search: 'liamwashere' + } + }); + } + + return { setRouteParams } } }); diff --git a/packages/vue/test-app/tests/e2e/specs/navigation.js b/packages/vue/test-app/tests/e2e/specs/navigation.js index cac8bc8719..7166bf1565 100644 --- a/packages/vue/test-app/tests/e2e/specs/navigation.js +++ b/packages/vue/test-app/tests/e2e/specs/navigation.js @@ -1,12 +1,8 @@ -describe('Inputs', () => { - beforeEach(() => { - cy.viewport(320, 568); - cy.visit('http://localhost:8080?ionic:mode=ios'); - cy.get('#navigation').click(); - cy.wait(500); - }) +describe.only('Navigation', () => { - it.skip('should swipe and abort', () => { + /* + // TODO move these to separate describe block + it.skip('should swipe and abort', () => { cy.ionPageInvisible('home'); cy.ionSwipeToGoBack(); cy.ionPageInvisible('home'); @@ -17,4 +13,40 @@ describe('Inputs', () => { cy.ionSwipeToGoBack(true); cy.ionPageVisible('home'); }); + */ + + it('should go to sibling page', () => { + cy.visit('http://localhost:8080'); + cy.get('ion-item#navigation').click(); + + cy.wait(500) + + cy.ionPageVisible('navigation') + cy.ionPageHidden('home') + }); + + it('should set query params and keep view in stack', () => { + cy.visit('http://localhost:8080/navigation'); + cy.get('#route-params').click(); + cy.ionPageVisible('navigation'); + }); + + it('should go back home', () => { + cy.visit('http://localhost:8080'); + cy.get('ion-item#navigation').click(); + + cy.ionBackClick('navigation'); + + cy.ionPageVisible('home'); + cy.ionPageDoesNotExist('navigation'); + }); + + it('should go back home with default href', () => { + cy.visit('http://localhost:8080/navigation'); + + cy.ionBackClick('navigation'); + + cy.ionPageVisible('home'); + cy.ionPageDoesNotExist('navigation'); + }); }); diff --git a/packages/vue/test-app/tests/e2e/support/commands.js b/packages/vue/test-app/tests/e2e/support/commands.js index b1be828be9..91ff743624 100644 --- a/packages/vue/test-app/tests/e2e/support/commands.js +++ b/packages/vue/test-app/tests/e2e/support/commands.js @@ -45,9 +45,20 @@ Cypress.Commands.add('ionPageInvisible', (pageId) => { .should('have.length', 1) }) +Cypress.Commands.add('ionPageHidden', (pageId) => { + cy.get(`div.ion-page[data-pageid=${pageId}]`) + .should('have.class', 'ion-page-hidden') + .should('have.length', 1) +}) + Cypress.Commands.add('ionBackClick', (pageId) => { cy.get(`div.ion-page[data-pageid=${pageId}]`) .should('be.visible', true) .find('ion-back-button') .click() }); + +Cypress.Commands.add('ionPageDoesNotExist', (pageId) => { + cy.get(`div.ion-page[data-pageid=${pageId}]`) + .should('not.exist') +});