refactored and tested getNavigationMap to make it less fragile. nav-button can also be a text link. Added test route for welcome-page. Pulled in navigation to external page using navigationMap from funnel.
This commit is contained in:
parent
4b411810eb
commit
537be49593
7 changed files with 85 additions and 20 deletions
|
|
@ -1,5 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<input type="button" class="nav-button" v-bind:value="text" v-on:click="navTo"/>
|
<input v-if="type == 'button'" type="button" class="nav-button" v-bind:value="text" v-on:click="navTo"/>
|
||||||
|
<p v-else type="" class="nav-text" v-on:click="navTo">{{text}}</p>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
@ -9,6 +10,7 @@
|
||||||
props: {
|
props: {
|
||||||
text: String,
|
text: String,
|
||||||
scenario: String,
|
scenario: String,
|
||||||
|
type: String,
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
navTo(){
|
navTo(){
|
||||||
|
|
@ -25,4 +27,11 @@
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
min-width: 70px;
|
min-width: 70px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.nav-text {
|
||||||
|
color: blue;
|
||||||
|
cursor: pointer;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<navButton text="back" :scenario="navigationScenarios.CLICKED_BACK"></navButton>
|
<navButton type="button" text="back" :scenario="navigationScenarios.CLICKED_BACK"></navButton>
|
||||||
Vehicle Year Placeholder
|
Vehicle Year Placeholder
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
<template>
|
<template>
|
||||||
<p>Welcome Page Placeholder</p>
|
<p>Welcome Page Placeholder</p>
|
||||||
<br />
|
<br />
|
||||||
<navButton text="Next" :scenario="navigationScenarios.CLICKED_FORWARD"></navButton>
|
<navButton type="button" text="Next" :scenario="navigationScenarios.CLICKED_FORWARD"></navButton>
|
||||||
|
<navButton text="Google" :scenario="navigationScenarios.CLICKED_TEST"></navButton>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ const routes = [
|
||||||
async beforeEnter(to, from, next) {
|
async beforeEnter(to, from, next) {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
to.query.issPage = to.query.issPage === undefined ? issPageValues.WELCOME_PAGE : to.query.issPage;
|
to.query.issPage = !to.query.issPage ? issPageValues.WELCOME_PAGE : to.query.issPage;
|
||||||
|
|
||||||
if (router.hasRoute(to.query.issPage)) {
|
if (router.hasRoute(to.query.issPage)) {
|
||||||
return next({ name: to.query.issPage, query: to.query, params: to.params });
|
return next({ name: to.query.issPage, query: to.query, params: to.params });
|
||||||
|
|
@ -77,7 +77,7 @@ async function GetRouteInfoFromPageName(pageName) {
|
||||||
});
|
});
|
||||||
|
|
||||||
return routeData;
|
return routeData;
|
||||||
}
|
};
|
||||||
|
|
||||||
// Navigate to the next route, depending on the scenario.
|
// Navigate to the next route, depending on the scenario.
|
||||||
router.navigate = async function (scenario, currentRoute, optionalQuery = {}, optionalParams = {}) {
|
router.navigate = async function (scenario, currentRoute, optionalQuery = {}, optionalParams = {}) {
|
||||||
|
|
@ -87,37 +87,62 @@ router.navigate = async function (scenario, currentRoute, optionalQuery = {}, op
|
||||||
}
|
}
|
||||||
|
|
||||||
// Match our maps up and navigate if we have a destination.
|
// Match our maps up and navigate if we have a destination.
|
||||||
const matchingScenarioMap = getNavigationMap(scenario, currentRoute);
|
const matchingScenarioMap = router.getNavigationMap(scenario, currentRoute);
|
||||||
const destinationIssPageValue = matchingScenarioMap.destinationIssPageValue;
|
|
||||||
|
|
||||||
if (destinationIssPageValue !== undefined) {
|
if (!matchingScenarioMap){
|
||||||
|
console.error("No matching scenario found. Please review the routing table.");
|
||||||
|
return;
|
||||||
|
} else if (matchingScenarioMap && matchingScenarioMap.error ) {
|
||||||
|
console.error(matchingScenarioMap.error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (matchingScenarioMap.destinationIssPageValue) {
|
||||||
// We're always pushing the same path, just changing query strings. Make sure our optional query strings get combined with our issPage one.
|
// We're always pushing the same path, just changing query strings. Make sure our optional query strings get combined with our issPage one.
|
||||||
router.push({
|
router.push({
|
||||||
name: "root",
|
name: "root",
|
||||||
query: Object.assign(optionalQuery, {
|
query: Object.assign(optionalQuery, {
|
||||||
issPage: destinationIssPageValue,
|
issPage: matchingScenarioMap.destinationIssPageValue,
|
||||||
}),
|
}),
|
||||||
params: optionalParams
|
params: optionalParams
|
||||||
});
|
});
|
||||||
} else if (matchingScenarioMap.destinationUrl !== undefined) {
|
} else if (matchingScenarioMap.destinationUrl) {
|
||||||
navigateToUrl(matchingScenarioMap.destinationUrl, optionalQuery);
|
navigateToUrl(matchingScenarioMap.destinationUrl, optionalQuery);
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Navigate to an external url.
|
||||||
|
function navigateToUrl(url, optionalQuery = {}) {
|
||||||
|
// possibly show some loading screen in the future here.
|
||||||
|
var externalUrl = new URL(url);
|
||||||
|
|
||||||
|
for (const queryKey in optionalQuery) {
|
||||||
|
externalUrl.searchParams.append(queryKey, optionalQuery[queryKey]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
window.location.assign(externalUrl);
|
||||||
|
};
|
||||||
|
|
||||||
// Get navigation map depending on the scenario and the current 'page' you're on.
|
// Get navigation map depending on the scenario and the current 'page' you're on.
|
||||||
function getNavigationMap(scenario, currentRoute) {
|
router.getNavigationMap = function (scenario, currentRoute) {
|
||||||
const issPageValue = currentRoute.query.issPage;
|
const issPageValue = currentRoute.query.issPage;
|
||||||
|
try {
|
||||||
const matchedQueryValue = routingTable()
|
const matchedQueryValue = routingTable()
|
||||||
.filter(
|
.filter(
|
||||||
(item) =>
|
(item) =>
|
||||||
item.issPageValue === issPageValue &&
|
item.issPageValue === issPageValue &&
|
||||||
item.maps.filter((map) => map.scenario === scenario).length > 0
|
item.maps.filter((map) => map.scenario === scenario).length > 0
|
||||||
)
|
);
|
||||||
.map((m) => m.maps.filter((map) => map.scenario === scenario))[0]
|
|
||||||
.filter(x => x.filter === true || x.filter === undefined);
|
|
||||||
|
|
||||||
return matchedQueryValue[0];
|
var maps = matchedQueryValue ? matchedQueryValue.map((m) => m.maps.filter((map) => map.scenario === scenario))[0] : undefined;
|
||||||
|
|
||||||
|
return maps ? maps.filter(x => x.filter === true || x.filter === undefined)[0] : undefined;
|
||||||
}
|
}
|
||||||
|
catch (e) {
|
||||||
|
return { error: e };
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
function GoToStartOn404(next) {
|
function GoToStartOn404(next) {
|
||||||
const errorPageName = issPageValues.ERROR_404;
|
const errorPageName = issPageValues.ERROR_404;
|
||||||
|
|
|
||||||
23
src/router/index.spec.js
Normal file
23
src/router/index.spec.js
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
import router from "@/router"
|
||||||
|
|
||||||
|
|
||||||
|
describe("router getNavigationMap", () => {
|
||||||
|
test("should return correct destinationUrl for welcome-page and CLICKED_TEST scenario", function() {
|
||||||
|
const currentRoute = { query: {issPage: "welcome-page"}};
|
||||||
|
expect(router.getNavigationMap("CLICKED_TEST", currentRoute)).toEqual({"destinationUrl": "https://www.google.com", "scenario": "CLICKED_TEST"});
|
||||||
|
});
|
||||||
|
|
||||||
|
test("should return undefined with bad issPage", function() {
|
||||||
|
const currentRoute = { query: {issPage: "badRoute"}};
|
||||||
|
expect(router.getNavigationMap("CLICKED_TEST", currentRoute)).toBeUndefined;
|
||||||
|
});
|
||||||
|
|
||||||
|
test("should return undefined with missing scenario", function() {
|
||||||
|
const currentRoute = { query: {issPage: "welcome-page"}};
|
||||||
|
expect(router.getNavigationMap("MISSING_SCENARIO", currentRoute)).toBeUndefined;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -5,6 +5,9 @@ const navigationScenarios = {
|
||||||
|
|
||||||
// YMMS
|
// YMMS
|
||||||
SELECTED_YEAR: "SELECTED_YEAR",
|
SELECTED_YEAR: "SELECTED_YEAR",
|
||||||
|
|
||||||
|
// TESTING
|
||||||
|
CLICKED_TEST: "CLICKED_TEST"
|
||||||
};
|
};
|
||||||
|
|
||||||
export { navigationScenarios };
|
export { navigationScenarios };
|
||||||
|
|
@ -18,10 +18,14 @@ const routingTable = function() {
|
||||||
maps: [
|
maps: [
|
||||||
{
|
{
|
||||||
scenario: navigationScenarios.CLICKED_FORWARD,
|
scenario: navigationScenarios.CLICKED_FORWARD,
|
||||||
destinationIssPageValue: issPageValues.VEHICLE_YEAR
|
destinationIssPageValue: issPageValues.VEHICLE_YEAR,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
scenario: navigationScenarios.CLICKED_TEST,
|
||||||
|
destinationUrl: "https://www.google.com"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue