CSR-98 to CSR-99

This commit is contained in:
FrankRua 2022-03-21 12:05:10 -04:00
parent e539ff455e
commit 1ac05c353b
10 changed files with 59 additions and 487 deletions

View file

@ -50,6 +50,10 @@ const endpoints = {
SaveOrder: {
url: "/order/api/v1/order/save",
method: "POST",
},
LoadOrder: {
url: "/order/api/v1/order/load",
method: "POST",
}
};

View file

@ -13,6 +13,9 @@ const storeActions = {
LOOKUP_VEHICLE_BY_VIN: "lookupVehicleByVin",
GET_PARTS_OR_QUESTIONS: "getPartsOrQuestions",
SAVE_ORDER: "saveOrder",
LOAD_ORDER: "loadOrder",
SET_REFERRAL_INFORMATION: "setReferralInformation",
SET_LOAD_ORDER_DATA: "setLoadOrderData",
// DEPENDENCY MUTATIONS
RESET_VEHICLE_STATE_AND_DEPENDENCIES: "resetVehicleAndDependencies",

View file

@ -33,6 +33,7 @@ const storeMutations = {
// OTHER MUTATIONS
UPDATE_PAGE_DATA: "updatePageData",
SET_LOAD_ORDER_INFO: "setLoadOrderInformation"
};

View file

@ -12,7 +12,6 @@ export default {
apiGatewayUrl = "https://localhost:44346";
}
// const apiGatewayUrl = applicationConfig.CONSUMER_APIGATEWAY_URL;
const payloadAndAnalyticsData = Object.assign({}, payload, {
AppName: "FixMyGlass",

View file

@ -1,21 +1,16 @@
import { storeActions } from "@/constants/store-actions.js";
import { storeMutations } from "@/constants/store-mutations.js";
import { cookieNames } from "@/constants/cookie-names";
import { navigationScenarios } from "@/router/router-constants/navigation-scenarios";
import store from "@/store";
import router from "@/router";
import { navigationScenarios } from "@/router/router-constants/navigation-scenarios";
import baseMixin from "../mixins/base-mixin";
// Read info from heritage funnel and reset state or load referral
export function handleInfoFromHeritageFunnel() {
const orderInfo = getHeritageCookieValue();
console.log("A")
console.log(orderInfo)
console.log(document.cookie)
if (orderInfo?.ShouldResetState) {
console.log("B")
store.dispatch(storeActions.RESET_STATE);
baseMixin.methods.dispatchNonBlockingStoreAction(storeActions.RESET_STATE);
deleteHeritageCookie();
}
else if (orderInfo?.DidHeritageFunnelUpdateLast) {
@ -47,17 +42,30 @@ export async function navigateToHeritageFunnel() {
}
export async function saveOrder() {
console.log("HI")
const savedOrderInfo = (await baseMixin.methods.dispatchNonBlockingStoreAction(storeActions.SAVE_ORDER)).data;
store.commit(storeMutations.UPDATE_REFERRAL_NUMBER, savedOrderInfo.referralNumber);
store.commit(storeMutations.UPDATE_REFERRAL_DATE, savedOrderInfo.referralDate);
store.commit(storeMutations.UPDATE_REFERRAL_CORRELATION_ID, savedOrderInfo.referralCorrelationId);
// Save the referral information back from the store.
await baseMixin.methods.dispatchNonBlockingStoreAction(storeActions.SET_REFERRAL_INFORMATION, {
referralNumber: savedOrderInfo.referralNumber,
correlationId: savedOrderInfo.referralCorrelationId,
referralDate: savedOrderInfo.referralDate,
})
// Set cookie properties.
setHeritageCookieProperties({
DidHeritageFunnelUpdateLast: false
})
}
export async function loadOrder() {
const loadOrderInfo = (await baseMixin.methods.dispatchNonBlockingStoreAction(storeActions.LOAD_ORDER)).data;
// Save the data from the loaded order to state.
await baseMixin.methods.dispatchNonBlockingStoreAction(storeActions.SET_LOAD_ORDER_DATA, { loadOrderInfo });
}
// --------- PRIVATE FUNCTIONS ---------
/* Start cookie related functions */
export function getHeritageCookieValue() {
console.log("A")
@ -83,7 +91,7 @@ function setHeritageCookieValue(cookieValue) {
let cookieValueJson = cookieValue;
if (typeof cookieValue == "object")
cookieValueJson = JSON.stringify(cookieValue);
document.cookie = `${cookieNames.ORDER_INFO}=${cookieValueJson}; path=/`;
}
@ -91,7 +99,7 @@ function setHeritageCookieProperties(properties) {
if (typeof properties == "object") {
let cookie = getHeritageCookieValue();
if (cookie != null) {
if (cookie !== null) {
Object.keys(properties).forEach(key => {
cookie[key] = properties[key];
});
@ -100,4 +108,4 @@ function setHeritageCookieProperties(properties) {
}
}
}
/* End cookie related functions */
/* End cookie related functions */

View file

@ -1,233 +0,0 @@
<template>
<div class="container-fluid container-shadow p-2 rounded-3">
<div class="row my-3">
<div class="col">
<vehicleBanner ref="vehicleBanner" :displayGenericVehicleImage=true />
</div>
</div>
<form>
<div class="row my-4">
<div class="col">
<label for="autocomplete">Street address</label>
<input ref="autocomplete"
id="autocomplete"
placeholder="Search"
class="form-control search-location"
type="text"
autocomplete="off" />
</div>
</div>
</form>
<form>
<div v-show="showAddressFields" class="row my-4">
<div class="col">
<label for="city">City</label>
<input ref="city"
id="city"
class="form-control"
type="text"
autocomplete="off" />
</div>
</div>
</form>
<form>
<div v-show="showAddressFields" class="row my-4">
<div class="col-6">
<label for="state">State</label>
<input ref="state"
id="state"
class="form-control"
type="text"
autocomplete="off" />
</div>
<div class="col-6">
<label for="zip">Zip</label>
<input ref="zip"
id="zip"
class="form-control"
type="text"
autocomplete="off" />
</div>
</div>
</form>
<div v-show="displayVerificationWarning" class="row my-4">
<div class="col">
<span style="color: red;">An accurate match may not have have been located. Please verify your address before continuing</span>
</div>
</div>
<div v-show="displayNoMatchWarning" class="row my-4">
<div class="col">
<span style="color: red;">An accurate match could not be located. Please re-enter your street address before continuing</span>
</div>
</div>
<div class="row my-4">
<div class="col">
<label for="firstName">First name</label>
<input ref="firstName"
id="firstName"
class="form-control"
type="text"
autocomplete="off" />
</div>
</div>
<div class="row my-4">
<div class="col">
<label for="lastName">Last name</label>
<input ref="lastName"
id="lastName"
class="form-control"
type="text"
autocomplete="off" />
</div>
</div>
<div class="row my-4">
<div class="col">
<label for="email">Email address</label>
<input ref="email"
id="email"
class="form-control"
type="text"
autocomplete="off" />
</div>
</div>
</div>
</template>
<script>
import vehicleBanner from "@/common-components/vehicle-banner/vehicle-banner";
export default {
name: "App",
components: {
vehicleBanner,
},
data() {
return {
showAddressFields: false,
displayVerificationWarning: false,
displayNoMatchWarning: false
};
},
mounted() {
this.$refs.vehicleBanner.initializeComponent({
GenericVehicleImage:
"https://digitalconsumercms-dev.safelite.com/images/default-source/default-album/blurred-image.jpg?sfvrsn=a6ce3034_3",
});
let addressField1 = document.getElementById("autocomplete");
let self = this;
//let apiKey = "AIzaSyDptGCkOPgN2uWJOy4ou4M33phRD4MAoJo"; // localhost:8080
let apiKey = "AIzaSyBji_2ApAj2vE_XNGyV-LaUEKrmuElpJ1w"; // Dev and above
this.$loadScript(`https://maps.googleapis.com/maps/api/js?key=${apiKey}&libraries=places`)
.then(() => {
// Script is loaded, initialize the autocomplete textbox
self.autocomplete = new window.google.maps.places.Autocomplete(
self.$refs.autocomplete,
{
componentRestrictions: { country: ["us"] },
fields: ["address_components"],
types: ["address"],
}
);
self.autocomplete.addListener('place_changed', fillInAddress);
addressField1.onblur = function() {
var hover = document.querySelector(".pac-container .pac-item:hover");
// if an item has been clicked, do nothing, otherwise get first solution and use Geocoder to get the place
if (hover === null) {
var item = document.querySelector(".pac-container .pac-item");
if (item != null) {
var firstResult = item.textContent;
var geocoder = new window.google.maps.Geocoder();
geocoder.geocode({
address: firstResult
}, function (results, status) {
if (status === window.google.maps.GeocoderStatus.OK) {
fillInAddress(results[0]);
self.displayVerificationWarning = true;
self.displayNoMatchWarning = false;
}
});
}
else {
let city = document.querySelector("#city");
let state = document.querySelector("#state");
let zip = document.querySelector("#zip");
city.value = "";
state.value = "";
zip.value = "";
self.displayVerificationWarning = false;
self.displayNoMatchWarning = true;
}
}
};
function fillInAddress(place) {
if (!place) {
place = self.autocomplete.getPlace();
}
if (place && place.address_components) {
let address1 = "";
let city = document.querySelector("#city");
let state = document.querySelector("#state");
let zip = document.querySelector("#zip");
self.showAddressFields = true;
for (const component of place.address_components) {
const componentType = component.types[0];
switch (componentType) {
case "street_number": {
address1 = `${component.long_name} ${address1}`;
break;
}
case "route": {
address1 += component.short_name;
break;
}
case "locality": {
city.value = component.long_name;
break;
}
case "administrative_area_level_1": {
state.value = component.short_name;
break;
}
case "postal_code": {
zip.value = component.long_name;
break;
}
}
addressField1.value = address1;
self.displayVerificationWarning = false;
self.displayNoMatchWarning = false;
}
}
else {
self.displayVerificationWarning = true;
self.displayNoMatchWarning = false;
}
}
})
.catch(() => {
// Failed to fetch script
console.log("Unable to load Google Places API script");
});
},
};
</script>

View file

@ -1,138 +0,0 @@
<template>
<div class="container-fluid">
<h4 class="m-0 p-2 bg-light rounded">List Buttons</h4>
<buttonQuestion :answers="years" text-position="text-start" questionText="List Button as Radio" groupName="years" />
<buttonQuestion :answers="checkboxAnswers" isMultiSelect text-position="text-start" questionText="List Button as checkbox" groupName="check-box-answers" />
<buttonQuestion :answers="checkboxAnswers" isMultiSelect text-position="text-end" questionText="List Button as checkbox text end" groupName="check-box-answers-text-right" />
<buttonQuestion :answers="years" questionText="List Button as Radio text center (default)" groupName="years-text-center" />
<buttonQuestion :answers="years" selectingInitiatesLoad questionText="List Button as Radio with spinner" groupName="years-text-spinner" />
<span>(Selecting button with spinner will cause page overlay, page refresh needed to select buttons from other groups)</span>
<h4 class="m-0 p-2 bg-light rounded mt-5">List ButtonHorizontals</h4>
<buttonQuestion buttonType="listButtonHorizontal" :answers="radioAnswers" questionText="List Button Horizontal as radio" groupName="lbh-radio" />
<buttonQuestion buttonType="listButtonHorizontal" isMultiSelect :answers="horizontalCheckboxAnswers" questionText="List Button Horizontal as checkbox" groupName="lbh-checkbox" />
<h4 class="m-0 p-2 bg-light rounded mt-5">List Cards</h4>
<buttonQuestion buttonType="listCard" :answers="listCardRadio" questionText="List Card as radio" groupName="lc-radio" />
<buttonQuestion isMultiSelect buttonType="listCard" :answers="listCardCheckBox" questionText="List Card as checkbox" groupName="lc-checkbox" />
<buttonQuestion buttonType="listCard" :answers="listCardGroup" questionText="List Cards as radios" groupName="lc-mult" />
<buttonQuestion buttonType="listCard" isMultiSelect :answers="listCardGroup" questionText="List Cards as checkboxes" groupName="lcc-mult" />
<buttonQuestion isWide buttonType="listCard" :answers="listCardGroup" questionText="List Cards as radios full width (text left image right)" groupName="lc-multWide" />
<buttonQuestion isWide isMultiSelect buttonType="listCard" :answers="listCardGroup" questionText="List Cards as checkboxes full width (text left image right)" groupName="lcc-multWide" />
<h4 class="m-0 p-2 bg-light rounded mt-5">Radio</h4>
<buttonQuestion buttonType="radio" :answers="radioAnswers" questionText="Used with radio" groupName="radio" />
</div>
</template>
<script>
import buttonQuestion from "@/common-components/button-question/button-question";
export default {
name: "App",
components: {
buttonQuestion
},
data() {
return {
years: [2023, 2022, 2021, 2020],
checkboxAnswers: [
"Checkbox Answer 1",
"Checkbox Answer 2",
"Checkbox Answer 3",
],
radioAnswers: ["Radio Answer 1", "Radio Answer 2", "Radio Answer 3"],
horizontalCheckboxAnswers: ["HCB Answer 1","HCB Answer 2","HCB Answer 3"],
horizontalRadioAnswers: ["HR Answer 1", "HR Answer 2", "HR Answer 3"],
listCardCheckBox: [
{
Name: "List-Card-CB",
Text: "List Card CB",
SubText: "checkbox",
ImageId: "53343ce4-5b6a-46aa-a80a-f948c1723955",
AnswerImageUrl: "https://digitalconsumercms-dev.safelite.com/images/default-source/damage-options/car.svg?sfvrsn=1468d7f1_3",
},
],
listCardRadio: [
{
Name: "List-Card-R",
Text: "List Card R",
SubText: "Radio",
ImageId: "53343ce4-5b6a-46aa-a80a-f948c1723955",
AnswerImageUrl: "https://digitalconsumercms-dev.safelite.com/images/default-source/damage-options/car.svg?sfvrsn=1468d7f1_3",
},
],
listCardCheckBoxHorizontalSubText: [
{
Name: "List-Card-CBHst",
Text: "List Card CBHst",
SubText: "With Subtext",
ImageId: "53343ce4-5b6a-46aa-a80a-f948c1723955",
AnswerImageUrl: "https://digitalconsumercms-dev.safelite.com/images/default-source/damage-options/car.svg?sfvrsn=1468d7f1_3",
},
],
listCardCheckBoxHorizontal: [
{
Name: "List-Card-CBH",
Text: "List Card CBH",
ImageId: "53343ce4-5b6a-46aa-a80a-f948c1723955",
AnswerImageUrl: "https://digitalconsumercms-dev.safelite.com/images/default-source/damage-options/car.svg?sfvrsn=1468d7f1_3",
},
],
listRadioHorizontalSubText: [
{
Name: "List-Card-RHst",
Text: "List Card RHst",
SubText: "With Subtext",
ImageId: "53343ce4-5b6a-46aa-a80a-f948c1723955",
AnswerImageUrl: "https://digitalconsumercms-dev.safelite.com/images/default-source/damage-options/car.svg?sfvrsn=1468d7f1_3",
},
],
listRadioHorizontal: [
{
Name: "List-Card-RH",
Text: "List Card RH",
ImageId: "53343ce4-5b6a-46aa-a80a-f948c1723955",
AnswerImageUrl: "https://digitalconsumercms-dev.safelite.com/images/default-source/damage-options/car.svg?sfvrsn=1468d7f1_3",
},
],
listCardGroup: [
{
Name: "Side-Window-1",
Text: "Side Window",
SubText: "With Subtext",
ImageId: "53343ce4-5b6a-46aa-a80a-f948c1723955",
AnswerImageUrl: "https://digitalconsumercms-dev.safelite.com/images/default-source/damage-options/car.svg?sfvrsn=1468d7f1_3",
},
{
Name: "Side-Window-2",
Text: "Side Window",
SubText: "With Subtext that is more than one line",
ImageId: "53343ce4-5b6a-46aa-a80a-f948c1723955",
AnswerImageUrl: "https://digitalconsumercms-dev.safelite.com/images/default-source/damage-options/car.svg?sfvrsn=1468d7f1_3",
},
{
Name: "Side-Window-3",
Text: "Side Window",
ImageId: "53343ce4-5b6a-46aa-a80a-f948c1723955",
AnswerImageUrl: "https://digitalconsumercms-dev.safelite.com/images/default-source/damage-options/car.svg?sfvrsn=1468d7f1_3",
},
],
};
},
}
</script>

View file

@ -1,74 +0,0 @@
<template>
<div class="container-fluid nested-radio">
<div class="row mb-1">
<div class="col">
<listCard
groupName="listcard1"
isWide="true"
buttonImage="https://digitalconsumercms-dev.safelite.com/images/default-source/damage-options/car.svg?sfvrsn=1468d7f1_3"
buttonLabel="Green Tint, Blue Shade"
buttonID="radio1"
/>
</div>
</div>
<div class="row mb-1">
<div class="col">
<buttonQuestion
buttonType="radio"
groupName="Demo Group"
buttonID="button1"
isRequired
value="test button"
screenReaderOnlyText="rain sensor, solar, 3rd visor band"
:answers="demoArray"
questionText="ok now select your features"
/>
</div>
</div>
<div class="row mb-2">
<div class="col">
<listCard
groupName="listcard1"
isWide="true"
buttonImage="https://digitalconsumercms-dev.safelite.com/images/default-source/damage-options/car.svg?sfvrsn=1468d7f1_3"
buttonLabel="Green Tint"
buttonID="radio2"
/>
</div>
</div>
</div>
</template>
<script>
import buttonQuestion from "@/common-components/button-question/button-question";
import listCard from "@/ux-components/list-card/list-card";
export default {
name: "nestedRadio",
components: {
buttonQuestion,
listCard,
},
data() {
return {
demoArray: [
"rain sensor, solar, 3rd visor band",
"rain sensor, heated glass, solar, 3rd visor band",
],
};
},
};
</script>
<style lang="scss">
.nested-radio {
.ui-radio {
flex-direction: column;
margin: 0.25rem 0;
}
p {
font-size: 0.875rem;
}
}
</style>

View file

@ -5,17 +5,15 @@ import { lazyLoadComponent } from "@/router/dynamic-routing/component-loader.js"
import { routingTable } from "@/router/router-constants/routing-table.js";
import { globalEvents, globalEventTypes } from "@/constants/events";
import { routerParameterKeys } from '@/router/router-constants/router-parameter-keys'
import { handleInfoFromHeritageFunnel, saveOrder, getHeritageCookieValue } from "@/helpers/heritage-integration-helper";
import baseMixin from "@/mixins/base-mixin";
import eventBus from "@/helpers/event-bus/event-bus";
import store from "@/store";
import { handleInfoFromHeritageFunnel, saveOrder, getHeritageCookieValue } from "@/helpers/heritage-integration-helper";
// Components
import ComponentTest from "@/layouts/component-test/component-test.vue";
import AddressPOC from "@/layouts/address-poc/address-poc.vue";
import FormTest from "@/layouts/form-test/form-test.vue";
import NestedRadio from "@/layouts/nested-radio-poc/nested-radio.vue";
import buttonQuestionExamples from "@/layouts/button-question-examples/button-question-examples.vue"
const routes = [
{
@ -28,26 +26,6 @@ const routes = [
name: "FormTest",
component: FormTest,
},
{
path: "/address-poc", // This is a temporary route for testing.
name: "AddressPOC",
component: AddressPOC,
},
{
path: "/form-test", // This is a temporary route for testing.
name: "FormTest",
component: FormTest,
},
{
path: "/nested-radio", // This is a temporary route for testing.
name: "NestedRadio",
component: NestedRadio,
},
{
path: "/button-question-examples", // This is a temporary route for testing.
name: "buttonQuestionExamples",
component: buttonQuestionExamples,
},
{
path: "/",
name: "root",
@ -139,9 +117,6 @@ async function navigate(scenario, currentRoute, invalidateOnSave, optionalQuery
return;
}
console.log(scenario)
console.log(currentRoute)
// Match our maps up and navigate if we have a destination.
const matchingScenarioMap = getNavigationMap(scenario, currentRoute);
const destinationFmgPageValue = matchingScenarioMap.destinationFmgPageValue;

View file

@ -139,6 +139,11 @@ export const mutations = {
},
resetState(state) {
Object.assign(state, getDefaultState());
},
// Misc Mutations
setLoadOrderInformation(state, orderInformation) {
}
}
@ -287,6 +292,16 @@ export const actions = {
});
},
// Misc Actions
setReferralInformation(context, { referralNumber, referralDate, correlationId }) {
context.commit(storeMutations.UPDATE_REFERRAL_NUMBER, referralNumber);
context.commit(storeMutations.UPDATE_REFERRAL_DATE, referralDate);
context.commit(storeMutations.UPDATE_REFERRAL_CORRELATION_ID, correlationId);
},
setLoadOrderData(context, { loadOrderData }) {
},
// Parts API Actions
getPartsOrQuestions(context, { carId, glassArray, zipCode, vin = '' }) {
return globalMethods.callHttpClient({
@ -324,6 +339,18 @@ export const actions = {
},
});
},
loadOrder(context, {referralNumber, referralDate, correlationId}) {
return globalMethods.callHttpClient({
method: endpoints.LoadOrder.method,
endpoint: endpoints.LoadOrder.url,
payload: {
referralNumber: referralNumber,
referralDate: referralDate,
correlationId: correlationId
},
});
}
}
export default createStore({