WIP add to customer-details page.

This commit is contained in:
Bryan Mauger 2023-05-16 12:55:23 -04:00
parent 80a3313528
commit b054afaf9a
4 changed files with 122 additions and 58 deletions

View file

@ -27,6 +27,8 @@ const errorMessages = {
VEHICLE_REQUIRED: "Please select a vehicle",
MOBILE_LOCATION_REQUIRED: "Please enter your service address",
DATE_REQUIRED: "Please select a date",
PHONE_REQUIRED: "Please enter your phone number",
PHONE_FORMAT: "Phone number must be 10 digits",
};
export { errorMessages };

View file

@ -1,24 +1,33 @@
<template>
<div class="phonenumber-question d-flex flex-column">
<label for="phone" class="mb-1 fw-bold">Phone Number:</label>
<label for="phone-number" class="mb-1 fw-bold" v-html="phoneNumberQuestionWidget"></label>
<input
class="form-control"
id="phone"
v-model="phoneNumber"
@input="formatPhoneNumber"
@blur="validatePhoneNumber"
:maxlength="phoneNumberMaxLength"
pattern="[0-9\-]+"
:aria-required="isRequired"
>
class="form-control"
id="phone-number"
v-model="phoneNumber"
@input="formatPhoneNumber"
:maxlength="phoneNumberMaxLength"
pattern="[0-9\-]+"
:aria-required="isRequired"
:validationRules="validationRules" />
<div v-show="errorMessage" class="row my-1 form-test-error">
<span
class="d-inline-flex small mt-0"
role="alert"
:class="[centerErrorMessage ? 'center-error-message' : '']"
>{{ errorMessage }}</span
>
</div>
</div>
</template>
<script>
export default {
name: "phonenumberquestion",
name: "phoneNumberQuestion",
props: {
isRequired: Boolean
cmsWidgetName: String,
isRequired: Boolean,
validationRules: String,
},
setup(props) {
const inputId = !props.customInputId ? `input-${crypto.randomUUID()}` : props.customInputId;
@ -29,11 +38,11 @@ export default {
switch (typeof modelValue) {
case "number":
initialValue = modelValue;
break;
initialValue = modelValue;
break;
default:
initialValue = modelValue && modelValue.length > 0 ? modelValue : "";
break;
initialValue = modelValue && modelValue.length > 0 ? modelValue : "";
break;
}
const fieldOptions = {
@ -44,62 +53,62 @@ export default {
},
data() {
return {
phoneNumber: '',
phoneNumber: "",
phoneNumberMaxLength: 12,
};
},
computed: {
phoneNumberQuestionWidget() {
return this.getCmsContent(this.cmsWidgetName, "QuestionText");
},
},
methods: {
formatPhoneNumber() {
// Remove all non-digit characters from the phone number
let formattedNumber = this.phoneNumber.replace(/\D/g, '');
let formattedNumber = this.phoneNumber.replace(/\D/g, "");
// Insert hyphens after the first three and the next three digits
if (formattedNumber.length > 3) {
formattedNumber = formattedNumber.slice(0, 3) + '-' + formattedNumber.slice(3);
formattedNumber = formattedNumber.slice(0, 3) + "-" + formattedNumber.slice(3);
}
if (formattedNumber.length > 7) {
formattedNumber = formattedNumber.slice(0, 7) + '-' + formattedNumber.slice(7);
formattedNumber = formattedNumber.slice(0, 7) + "-" + formattedNumber.slice(7);
}
// Update the phone number with the formatted version
this.phoneNumber = formattedNumber;
},
validatePhoneNumber() {
if (this.phoneNumber.length !== this.phoneNumberMaxLength) {
alert('Phone number must be 10 digits');
}
},
},
mounted() {
this.$nextTick(() => {
// Prevent "1" as the first number
const inputElement = document.getElementById('phone');
inputElement.addEventListener('keydown', (event) => {
if (inputElement.selectionStart === 0 && event.key === '1') {
const inputElement = document.getElementById("phone-number");
inputElement.addEventListener("keydown", (event) => {
if (inputElement.selectionStart === 0 && event.key === "1") {
event.preventDefault();
}
});
});
}
},
};
</script>
<style lang="scss">
.phonenumber-question {
label {
color: $black;
.phonenumber-question {
label {
color: $black;
}
input {
border-radius: 0.5rem;
border: 1px solid $gray-500;
height: 48px;
&:hover {
box-shadow: 0 0 0 4px #9fcee6;
}
input {
border-radius: 0.5rem;
border: 1px solid $gray-550;
height: 48px;
&:hover {
box-shadow: 0 0 0 4px #9fcee6;
}
&:focus {
box-shadow: 0 0 0 2.5px $blue;
outline: none;
}
&:focus {
box-shadow: 0 0 0 2.5px $blue;
outline: none;
}
}
}
</style>

View file

@ -27,7 +27,7 @@
<script>
export default {
name: "textareaquestion",
name: "textareaQuestion",
props: {
cmsWidgetName: String,
isRequired: Boolean,
@ -107,7 +107,7 @@ export default {
}
textarea {
border-radius: 0.5rem;
border: 1px solid $gray-550;
border: 1px solid $gray-500;
height: 88px;
&:hover {
box-shadow: 0 0 0 4px #9fcee6;

View file

@ -1,22 +1,70 @@
<template>
<textareaquestion
v-model="techNotes"
cmsWidgetName="TextAreaContentWidget"
maxLength="250" />
<phonenumberquestion
v-model="phoneNumber"
isRequired />
<Form @submit="onSubmit" @invalid-submit="onInvalidSubmit" ref="theForm" v-slot="{ meta }">
<div class="page-container-grouped-styles">
<funnelHeader cmsWidgetName="FunnelHeaderWidget" />
<funnelSubHeader cmsWidgetName="FunnelSubHeaderWidget" class="my-5" />
<!-- <textboxQuestion
cmsWidgetName="FirstNameQuestionWidget"
v-model="customerModel.firstName"
ref="firstName"
inputId="08497a2efd9a4a73a70360ab47b4838d"
validationRules="first-name-required" /> -->
<textboxQuestion
class="mb-4"
cmsWidgetName="emailQuestionWidget"
v-model="email"
inputId="email"
validationRules="email-address-required|email-address-format" />
<phoneNumberQuestion
cmsWidgetName="phoneNumberQuestionWidget"
class="mb-4"
v-model="phoneNumber"
isRequired
validationRules="phone-number-required" />
<textareaQuestion
class="mb-5"
v-model="techNotes"
cmsWidgetName="TextAreaContentWidget"
maxLength="250" />
<funnel-footer
cmsWidgetName="FunnelFooterWidget"
ref="funnelFooter"
:isForwardActionDisabled="!meta.valid"
@back-clicked="backButtonAction"
@ForwardClicked="forwardButtonAction" />
</div>
</Form>
</template>
<script>
import textareaquestion from "@/digital-components/textarea-question/textarea-question";
import phonenumberquestion from "@/digital-components/phonenumber-question/phonenumber-question";
import funnelHeader from "@/fmg-components/funnel-header/funnel-header";
import funnelFooter from "@/fmg-components/funnel-footer/funnel-footer";
import funnelSubHeader from "@/fmg-components/funnel-sub-header/funnel-sub-header";
import textareaQuestion from "@/digital-components/textarea-question/textarea-question";
import phoneNumberQuestion from "@/digital-components/phonenumber-question/phonenumber-question";
import textboxQuestion from "@/digital-components/textbox-question/textbox-question";
//Supporting files
import { fetchCmsContentForPage } from "@/helpers/cms-content-helper";
import { settleAllPromises } from "@/helpers/layout-helper";
import { storeActions } from "@/constants/store-actions";
import { errorMessages } from "@/constants/error-messages";
import { routerParams } from "@/router/router-constants/router-params";
import { getDamageString, isGlassAvailableForCarId } from "@/helpers/damage-helper";
import { required, regex } from "@/helpers/validation-rules";
import { Form, defineRule } from "vee-validate";
// DEFINE VALIDATION RULES
defineRule("first-name-required", required(errorMessages.FIRST_NAME_REQUIRED));
defineRule("last-name-required", required(errorMessages.LAST_NAME_REQUIRED));
defineRule("phone-number-required", required(errorMessages.PHONE_REQUIRED));
defineRule("email-address-required", required(errorMessages.EMAIL_ADDRESS_REQUIRED));
defineRule(
"email-address-format",
regex(
/^([a-zA-Z0-9_\-.+]+)@([a-zA-Z0-9-]+)\.([a-zA-Z]{2,})$/,
errorMessages.EMAIL_ADDRESS_FORMAT
)
);
export default {
name: "customer-details",
async beforeRouteEnter(to, from, next) {
@ -49,8 +97,13 @@ export default {
},
},
components: {
textareaquestion,
phonenumberquestion,
funnelHeader,
funnelSubHeader,
textareaQuestion,
phoneNumberQuestion,
textboxQuestion,
funnelFooter,
Form,
},
};
</script>