From 5c1f1e9ac68c06c1bf860d5c76da97eece7a8181 Mon Sep 17 00:00:00 2001 From: brydon1 Date: Tue, 11 Jul 2023 13:21:56 -0400 Subject: [PATCH] defining rules in separate file --- src/constants/global-rules.js | 9 ++++ .../textarea-question/textarea-question.vue | 9 ++++ src/helpers/global-rule-definer.js | 47 ++++++++++++++++ .../contact-details/contact-details.spec.js | 4 +- .../contact-details/contact-details.vue | 23 +++++--- src/main.js | 54 ++++++------------- 6 files changed, 98 insertions(+), 48 deletions(-) create mode 100644 src/helpers/global-rule-definer.js diff --git a/src/constants/global-rules.js b/src/constants/global-rules.js index becfe2f9..c78cd07e 100644 --- a/src/constants/global-rules.js +++ b/src/constants/global-rules.js @@ -1,3 +1,12 @@ +/** +* @file global-rules.js +* @author MB +* @copyright Safelite +*/ + +/** + * @summary Contains all the globally defined rules. + */ const globalRules = { POLICYHOLDER_FIRST_NAME_REQUIRED: 'policyholder-first-name-required', POLICYHOLDER_LAST_NAME_REQUIRED: 'policyholder-last-name-required', diff --git a/src/digital-components/textarea-question/textarea-question.vue b/src/digital-components/textarea-question/textarea-question.vue index 24776aed..9336a1c0 100644 --- a/src/digital-components/textarea-question/textarea-question.vue +++ b/src/digital-components/textarea-question/textarea-question.vue @@ -104,9 +104,15 @@ export default { }; }, computed: { + /** + * @summary Returns the number of characters in the textarea field. + */ characterCount() { return this?.modelValue?.length ?? 0; }, + /** + * @summary Returns the CMS text associated with the question. + */ questionText() { return this.getCmsContent(this.cmsWidgetName, 'QuestionText'); }, @@ -120,6 +126,9 @@ export default { } }, methods: { + /** + * @summary Removes whitespace from the end of pasted content. + */ trimOnPaste(evt) { evt.stopPropagation(); evt.preventDefault(); diff --git a/src/helpers/global-rule-definer.js b/src/helpers/global-rule-definer.js new file mode 100644 index 00000000..4763d8e6 --- /dev/null +++ b/src/helpers/global-rule-definer.js @@ -0,0 +1,47 @@ +import { defineRule } from 'vee-validate'; +import { errorMessages } from '@/constants/error-messages'; +import globalRules from '@/constants/global-rules'; +import { required, regex } from '@/helpers/validation-rules'; + +/** + * @summary Define global rules related to names + */ +function defineGlobalNameRules() { + defineRule(globalRules.FIRST_NAME_REQUIRED, required(errorMessages.FIRST_NAME_REQUIRED)); + defineRule(globalRules.LAST_NAME_REQUIRED, required(errorMessages.LAST_NAME_REQUIRED)); + defineRule(globalRules.POLICYHOLDER_FIRST_NAME_REQUIRED, + required(errorMessages.POLICYHOLDER_FIRST_NAME_REQUIRED)); + defineRule(globalRules.POLICYHOLDER_LAST_NAME_REQUIRED, + required(errorMessages.POLICYHOLDER_LAST_NAME_REQUIRED)); +} + +/** + * @summary Define global rules related to email addresses + */ +function defineGlobalEmailRules() { + defineRule(globalRules.EMAIL_ADDRESS_REQUIRED, required(errorMessages.EMAIL_ADDRESS_REQUIRED)); + defineRule(globalRules.EMAIL_ADDRESS_FORMAT, + regex(/^([a-zA-Z0-9_\-.+]+)@([a-zA-Z0-9_\-.]+)\.([a-zA-Z]{2,})$/, + errorMessages.EMAIL_ADDRESS_FORMAT)); +} + +/** + * @summary Define global rules related to phone numbers + */ +function defineGlobalPhoneNumberRules() { + defineRule(globalRules.PHONE_NUMBER_REQUIRED, required(errorMessages.PHONE_NUMBER_REQUIRED)); + defineRule(globalRules.PHONE_NUMBER_FORMAT, + regex(/^(\([0-9]{3}\)|[0-9]{3}) *[-.]? *[0-9]{3} *[-.]? *[0-9]{4}$/, + errorMessages.PHONE_NUMBER_FORMAT)); +} + +/** + * @summary Define all global rules + */ +export default function defineGlobalRules() { + defineGlobalNameRules(); + defineGlobalEmailRules(); + defineGlobalPhoneNumberRules(); + + defineRule(globalRules.OPTION_REQUIRED, required(errorMessages.OPTION_REQUIRED)); +} diff --git a/src/layouts/contact-details/contact-details.spec.js b/src/layouts/contact-details/contact-details.spec.js index f55bc6cc..67f3b83e 100644 --- a/src/layouts/contact-details/contact-details.spec.js +++ b/src/layouts/contact-details/contact-details.spec.js @@ -89,7 +89,7 @@ describe('contactDetails.vue', () => { // Assert expect(textUpdatesCheckbox.exists()).toBe(true); - expect(wrapper.vm.textContentText).toBe(`${checkboxLabel}*`); + expect(wrapper.vm.requestTextUpdatesCheckboxText).toBe(`${checkboxLabel}*`); }); test('Should render technician notes textarea question subcomponent', () => { // Arrange @@ -114,7 +114,7 @@ describe('contactDetails.vue', () => { const mountOptions = getMountOptions(); mountOptions.mixins = [mockMixin]; const wrapper = shallowMount(contactDetails, mountOptions); - const expectedDisclaimerText = `*${disclaimerText} I also agree to Safelite\'s`; + const expectedDisclaimerText = `*${disclaimerText} I also agree to Safelite's`; // Act const componentText = wrapper.text(); diff --git a/src/layouts/contact-details/contact-details.vue b/src/layouts/contact-details/contact-details.vue index bf98cad8..c2ff4ade 100644 --- a/src/layouts/contact-details/contact-details.vue +++ b/src/layouts/contact-details/contact-details.vue @@ -53,7 +53,7 @@ class="margin-top-8" checkboxName="requestTextUpdates" buttonID="requestTextUpdates" - :checkboxLabel="textContentText" /> + :checkboxLabel="requestTextUpdatesCheckboxText" /> -