created page data methods for Vuex / Router

This commit is contained in:
FrankRua 2022-02-25 14:48:22 -05:00
parent d49e363e6c
commit e43b2caaeb
9 changed files with 71 additions and 29 deletions

View file

@ -13,6 +13,7 @@ const storeMutations = {
UPDATE_IS_REPAIR: "updateIsRepair", UPDATE_IS_REPAIR: "updateIsRepair",
UPDATE_NUMBER_OF_CHIPS: "updateNumberOfChips", UPDATE_NUMBER_OF_CHIPS: "updateNumberOfChips",
UPDATE_GLASS_TO_REPLACE: "updateGlassToReplace", UPDATE_GLASS_TO_REPLACE: "updateGlassToReplace",
UPDATE_PARTS: "updateParts",
// EVENT BUS MUTATIONS // EVENT BUS MUTATIONS
ADD_EVENT_TO_BUS: "addEventToBus", ADD_EVENT_TO_BUS: "addEventToBus",
@ -24,6 +25,9 @@ const storeMutations = {
RESET_REGISTRATION_STATE: "resetRegistrationState", RESET_REGISTRATION_STATE: "resetRegistrationState",
RESET_PARTS_STATE: "resetPartsState", RESET_PARTS_STATE: "resetPartsState",
// OTHER MUTATIONS
UPDATE_PAGE_DATA: "updatePageData",
}; };
export { storeMutations }; export { storeMutations };

View file

@ -145,7 +145,7 @@ export default {
const partsData = await baseMixin.methods.dispatchNonBlockingStoreAction(this.storeActions.GET_PARTS_OR_QUESTIONS, const partsData = await baseMixin.methods.dispatchNonBlockingStoreAction(this.storeActions.GET_PARTS_OR_QUESTIONS,
{ carId: this.$store.getters.vehicle.carId, glassArray: this.selectedGlassToReplace()}, false); { carId: this.$store.getters.vehicle.carId, glassArray: this.selectedGlassToReplace()}, false);
this.$router.navigateAfterSave(this.navigationScenarios.SELECTED_GLASS_MULTIPLE_PARTS, this.$route, {}, { [routerParameterKeys.VEHICLE_PARTS_DATA]: JSON.stringify(partsData.data)}); this.$router.navigateAfterSave(this.navigationScenarios.SELECTED_GLASS_MULTIPLE_PARTS, this.$route, {}, {}, partsData.data);
}, },
selectedGlassToReplace() { selectedGlassToReplace() {

View file

@ -44,7 +44,7 @@ import {
} from "@/constants/dynamictext-mapper"; } from "@/constants/dynamictext-mapper";
export default { export default {
name: "part-question", name: "glass-part-question",
inheritAttrs: false, inheritAttrs: false,
data() { data() {
return { return {

View file

@ -17,15 +17,15 @@
<hr v-if="i > 0" /> <hr v-if="i > 0" />
</div> </div>
<partQuestion :ref="`${refPrefix}-${item.glassLocation}`" v-model="glassParts[item.glassLocation + '-' + item.glassName]" :glassLocation="item.glassLocation" :glassName="item.glassName" :colorAnswers="item.colorAnswers" /> <glassPartQuestion :ref="`${refPrefix}-${item.glassLocation}`" v-model="glassParts[item.glassLocation + '-' + item.glassName]" :glassLocation="item.glassLocation" :glassName="item.glassName" :colorAnswers="item.colorAnswers" />
</div> </div>
<funnelFooter ref="funnelFooter" @back-clicked="backButtonAction" /> <funnelFooter ref="funnelFooter" @back-clicked="backButtonAction" @ForwardClicked="forwardButtonAction" />
</div> </div>
</template> </template>
<script> <script>
// Components // Components
import partQuestion from "@/layouts/vehicle-parts/part-question/part-question"; import glassPartQuestion from "@/layouts/vehicle-parts/glass-part-question/glass-part-question";
import funnelHeader from "@/common-components/funnel-header/funnel-header"; import funnelHeader from "@/common-components/funnel-header/funnel-header";
import vehicleBanner from "@/common-components/vehicle-banner/vehicle-banner"; import vehicleBanner from "@/common-components/vehicle-banner/vehicle-banner";
import funnelSubHeader from "@/common-components/funnel-sub-header/funnel-sub-header"; import funnelSubHeader from "@/common-components/funnel-sub-header/funnel-sub-header";
@ -39,10 +39,10 @@ import {
import { import {
settleAllPromises settleAllPromises
} from "@/helpers/layout-helper"; } from "@/helpers/layout-helper";
import {
routerParameterKeys
} from "@/router/router-constants/router-parameter-keys";
import store from "@/store"; import store from "@/store";
import {
fmgPageValues
} from "@/router/router-constants/fmgPage-values";
export default { export default {
name: "vehicle-parts", name: "vehicle-parts",
@ -73,7 +73,7 @@ export default {
resultMap.cmsContent.FunnelFooterWidget resultMap.cmsContent.FunnelFooterWidget
); );
// Part Question dynamic component // Glass Part Question dynamic component
Object.keys(vm.$refs) Object.keys(vm.$refs)
.filter((r) => r.includes(vm.refPrefix) && vm.$refs[r][0] !== undefined) .filter((r) => r.includes(vm.refPrefix) && vm.$refs[r][0] !== undefined)
.forEach((c) => .forEach((c) =>
@ -100,7 +100,7 @@ export default {
}; };
}, },
components: { components: {
partQuestion, glassPartQuestion,
funnelHeader, funnelHeader,
vehicleBanner, vehicleBanner,
funnelSubHeader, funnelSubHeader,
@ -109,7 +109,7 @@ export default {
}, },
computed: { computed: {
Parts() { Parts() {
const partsData = JSON.parse(this.$route.params[routerParameterKeys.VEHICLE_PARTS_DATA]); const partsData = store.getters.pageData(this.$route.query.fmgPage);
// Map API result data, to vehicle-parts data structure // Map API result data, to vehicle-parts data structure
const mappedData = partsData.partsOrQuestions.map(g => { const mappedData = partsData.partsOrQuestions.map(g => {
@ -133,13 +133,25 @@ export default {
}, },
}, },
methods: { methods: {
arePagePrerequisitesValid(parameters) { arePagePrerequisitesValid() {
if (store.getters.damage.isRepair !== null && parameters[routerParameterKeys.VEHICLE_PARTS_DATA] !== undefined) { // Check if isRepair is populated and if the pageData we need is here (Parts data)
if (store.getters.damage.isRepair !== null && Object.keys(store.getters.pageData(fmgPageValues.VEHICLE_PARTS)).length !== 0) {
return true; return true;
} }
return false
return false
},
backButtonAction() {
this.$router.navigate(
this.navigationScenarios.CLICKED_BACK,
this.$route
);
},
forwardButtonAction() {
const pickedParts = '';
} }
}, },
}; };
</script> </script>

View file

@ -18,6 +18,9 @@ export default {
return store.dispatch(type, payload); return store.dispatch(type, payload);
}, },
savePageDataToStore(page, data){
store.commit(storeMutations.UPDATE_PAGE_DATA, { page: page, data: data });
}
}, },
computed: { computed: {
storeActions() { storeActions() {

View file

@ -1,6 +1,7 @@
// Supporting files // Supporting files
import { createWebHistory, createRouter } from "vue-router"; import { createWebHistory, createRouter } from "vue-router";
import { storeActions } from "@/constants/store-actions"; import { storeActions } from "@/constants/store-actions";
import baseMixin from "@/mixins/base-mixin";
import { lazyLoadComponent } from "@/router/dynamic-routing/component-loader.js"; import { lazyLoadComponent } from "@/router/dynamic-routing/component-loader.js";
import { routingTable } from "@/router/router-constants/routing-table.js"; import { routingTable } from "@/router/router-constants/routing-table.js";
import { globalEvents, globalEventTypes } from "@/constants/events"; import { globalEvents, globalEventTypes } from "@/constants/events";
@ -55,7 +56,7 @@ const routes = [
.getRoutes() .getRoutes()
.filter((x) => x.name === to.query.fmgPage)[0].components; .filter((x) => x.name === to.query.fmgPage)[0].components;
if (!arePagePrerequisitesValid(component, to.params)) { if (!arePagePrerequisitesValid(component)) {
await GoToFunnelStartOn404(next); await GoToFunnelStartOn404(next);
} }
@ -80,7 +81,7 @@ const routes = [
.filter((x) => x.name === routeData[0].name)[0] .filter((x) => x.name === routeData[0].name)[0]
.components.default(); .components.default();
if (!arePagePrerequisitesValid(nextComponent, to.params)) { if (!arePagePrerequisitesValid(nextComponent)) {
await GoToFunnelStartOn404(next); await GoToFunnelStartOn404(next);
} }
@ -108,18 +109,18 @@ const router = createRouter({
//---------------------------------------------------------- Router Functions ---------------------------------------------------------- //---------------------------------------------------------- Router Functions ----------------------------------------------------------
router.navigate = (scenario, currentRoute, optionalQuery = {}, optionalParams = {}) => { router.navigate = (scenario, currentRoute, optionalQuery = {}, optionalParams = {}, optionalPageData = {}) => {
navigate(scenario, currentRoute, false, optionalQuery, optionalParams); navigate(scenario, currentRoute, false, optionalQuery, optionalParams, optionalPageData);
} }
router.navigateAfterSave = (scenario, currentRoute, optionalQuery = {}, optionalParams = {}) => { router.navigateAfterSave = (scenario, currentRoute, optionalQuery = {}, optionalParams = {}, optionalPageData = {}) => {
navigate(scenario, currentRoute, true, optionalQuery, optionalParams); navigate(scenario, currentRoute, true, optionalQuery, optionalParams, optionalPageData);
} }
// PRIVATE FUNCTIONS // PRIVATE FUNCTIONS
// Navigate to the next route, depending on the scenario. // Navigate to the next route, depending on the scenario.
function navigate(scenario, currentRoute, invalidateOnSave, optionalQuery = {}, optionalParams = {}) { function navigate(scenario, currentRoute, invalidateOnSave, optionalQuery = {}, optionalParams = {}, optionalPageData = {}) {
if (!scenario) { if (!scenario) {
console.error("No scenario provided. Please review the routing table."); console.error("No scenario provided. Please review the routing table.");
return; return;
@ -138,6 +139,9 @@ function navigate(scenario, currentRoute, invalidateOnSave, optionalQuery = {},
resetDependentState(currentComponent); resetDependentState(currentComponent);
} }
// Append page data to the store for the NEXT page, if any. It will be an empty object if none is provided.
baseMixin.methods.savePageDataToStore(matchingScenarioMap.destinationFmgPageValue, optionalPageData);
router.push({ router.push({
name: "root", name: "root",
query: Object.assign(optionalQuery, { query: Object.assign(optionalQuery, {
@ -217,8 +221,8 @@ async function GoToFunnelStartOn404(next) {
} }
// Checks arePagePrerequisitesValid on the component passed in. // Checks arePagePrerequisitesValid on the component passed in.
function arePagePrerequisitesValid(component, parameters = {}) { function arePagePrerequisitesValid(component) {
return component.default.methods.arePagePrerequisitesValid(parameters); return component.default.methods.arePagePrerequisitesValid();
} }
// Reset dependant state on route change. // Reset dependant state on route change.

View file

@ -1,5 +1,3 @@
const routerParameterKeys = { const routerParameterKeys = { };
VEHICLE_PARTS_DATA: "vehiclePartsData",
};
export { routerParameterKeys }; export { routerParameterKeys };

View file

@ -76,6 +76,19 @@ const routingTable = [
}, },
], ],
}, },
{
fmgPageValue: fmgPageValues.VEHICLE_PARTS,
maps: [
{
scenario: navigationScenarios.CLICKED_BACK,
destinationFmgPageValue: fmgPageValues.VEHICLE_DAMAGE,
},
{
scenario: navigationScenarios.SELECTED_PARTS,
destinationFmgPageValue: fmgPageValues.QUOTE,
},
],
},
]; ];
export { routingTable }; export { routingTable };

View file

@ -27,12 +27,12 @@ export const state = {
}, },
lineItems:{ lineItems:{
glassParts: null, glassParts: null,
childParts: null,
otherParts: null otherParts: null
} }
}, },
applicationUser: { applicationUser: {
eventBus: [], eventBus: [],
pageData: {}
}, },
} }
@ -75,7 +75,12 @@ export const mutations = {
updateGlassToReplace(state, glassToReplace){ updateGlassToReplace(state, glassToReplace){
state.order.damage.glassToReplace = glassToReplace; state.order.damage.glassToReplace = glassToReplace;
}, },
updateParts(state, partsData){
state.order.lineItems.glassParts = partsData;
},
updatePageData(state, pageData){
state.applicationUser.pageData[pageData.page] = pageData.data;
},
// EVENT BUS MUTATIONS // EVENT BUS MUTATIONS
addEventToBus(state, event) { addEventToBus(state, event) {
@ -136,7 +141,10 @@ export const getters = {
}, },
eventBus: (state) => state.applicationUser.eventBus, eventBus: (state) => state.applicationUser.eventBus,
damage: (state) => state.order.damage, damage: (state) => state.order.damage,
lineItems: (state) => state.order.lineItems lineItems: (state) => state.order.lineItems,
pageData: (state) => (page) => {
return state.applicationUser.pageData[page];
}
} }
// Export Actions // Export Actions