diff --git a/package-lock.json b/package-lock.json index 4547f28b..0ab28ced 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "axios-retry": "^3.5.0", "bootstrap": "^5.3", "iframe-resizer": "^4.3.9", - "maska": "^1.5.0", + "maska": "^2.1.1", "pinia": "^2.1.4", "pinia-plugin-persistedstate": "^2.2.0", "uuid": "^9.0.1", @@ -13947,9 +13947,9 @@ } }, "node_modules/maska": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/maska/-/maska-1.5.0.tgz", - "integrity": "sha512-BwZXzs5gHeu6wtn3iWFqrKRtcsM3sTpkHvfAngVNVNlN7tl9ZyQUeHTz11s9Sy7Bq1MoQ+xyR/+IzghY8nR84Q==" + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/maska/-/maska-2.1.11.tgz", + "integrity": "sha512-IGqWjBnKxMYcVa06pb4mPfag9sJjnR2T15CdGfQ2llR3gajiSd4AxXCvNqHMEq9W3UBhjjTazgWumsP3sWrUSg==" }, "node_modules/mdn-data": { "version": "2.0.14", diff --git a/package.json b/package.json index 39dd64ab..82ca9450 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "axios-retry": "^3.5.0", "bootstrap": "^5.3", "iframe-resizer": "^4.3.9", - "maska": "^1.5.0", + "maska": "^2.1.1", "pinia": "^2.1.4", "pinia-plugin-persistedstate": "^2.2.0", "uuid": "^9.0.1", @@ -61,4 +61,4 @@ "vitest": "^0.33.0", "volar-service-vetur": "latest" } -} +} \ No newline at end of file diff --git a/src/constants/maska-masks.js b/src/constants/maska-masks.js new file mode 100644 index 00000000..b7d321c0 --- /dev/null +++ b/src/constants/maska-masks.js @@ -0,0 +1,15 @@ +const MaskaFormattedMasks = { + PHONE_NUMBER: { + mask: 'x##-###-####', + tokens: { + token: 'x', + pattern: '[2-9]' + } + }, + ZIPCODE: { + mask: '#####', + tokens: null + } +}; + +export default MaskaFormattedMasks; diff --git a/src/digital-components/textbox-question/textbox-question.vue b/src/digital-components/textbox-question/textbox-question.vue index 2ba8d5b9..c97a6b4a 100644 --- a/src/digital-components/textbox-question/textbox-question.vue +++ b/src/digital-components/textbox-question/textbox-question.vue @@ -19,7 +19,9 @@ :id="inputId" :ref="inputId" v-model.trim="value" - v-maska="mask" + v-maska + :data-maska="getMaskFromProp" + :data-maska-tokens="getTokensFromProp" class="form-control" :type="type" :name="inputId" @@ -97,7 +99,7 @@ export default { iconRight: Boolean, // Place icon on right side of text input, otherwise default is left if hasIcon prop is used hasError: Boolean, mask: { - type: String, + type: [String, Object], default: '' }, validationRules: String, @@ -183,6 +185,21 @@ export default { return questionText; } + }, + getMaskFromProp() { + if (this.mask) { + if (this.mask.mask) { + return this.mask.mask; + } + return this.mask; + } + return null; + }, + getTokensFromProp() { + if (this.mask?.tokens) { + return `{ '${this.mask.tokens.token}': { 'pattern': '${this.mask.tokens.pattern}' }}`; + } + return null; } }, watch: { diff --git a/src/layouts/bailout-page/bailout-page.vue b/src/layouts/bailout-page/bailout-page.vue index 4a60c8e9..131665fe 100644 --- a/src/layouts/bailout-page/bailout-page.vue +++ b/src/layouts/bailout-page/bailout-page.vue @@ -39,7 +39,7 @@ inputId="phoneNumberField" cmsWidgetName="PhoneNumberQuestion" isRequired - :mask="mask" + :mask="phoneMask" disableAutoFill :validationRules="rules.phoneNumber" /> @@ -53,6 +53,7 @@ import textboxQuestion from '@/digital-components/textbox-question/textbox-quest // Supporting Files import { useMainStore } from '@/store/index.js'; import globalRules from '@/constants/global-rules.js'; +import MaskaFormattedMasks from '@/constants/maska-masks'; import widgetFields from '@/constants/cms-widget-fields.js'; export default { @@ -102,15 +103,8 @@ export default { footerButtonText() { return this.getCmsContent(this.widget.drawerFooter, widgetFields.FOOTER_WIDGET.FORWARD_BUTTON_TEXT); }, - mask() { - return { - mask: 'x##-###-####', - tokens: { - x: { - pattern: /[2-9]/ - } - } - }; + phoneMask() { + return MaskaFormattedMasks.PHONE_NUMBER; } }, methods: { diff --git a/src/layouts/welcome-page/welcome-page.vue b/src/layouts/welcome-page/welcome-page.vue index df58619e..30b388f9 100644 --- a/src/layouts/welcome-page/welcome-page.vue +++ b/src/layouts/welcome-page/welcome-page.vue @@ -86,7 +86,7 @@ cmsWidgetName="PhoneNumberQuestion" :validationRules="rules.phoneNumber" isRequired - :mask="mask" + :mask="phoneMask" disableAutoFill /> @@ -197,6 +197,7 @@ import { useMainStore } from '@/store'; import states from '@/constants/states'; import globalRules from '@/constants/global-rules'; import routerParams from '@/router/router-constants/router-params'; +import MaskaFormattedMasks from '@/constants/maska-masks'; // define validation rules defineRule('damage-option-required', required(errorMessages.DAMAGE_OPTION_REQUIRED)); @@ -313,15 +314,8 @@ export default { maxCoverageLookupAttemptsReached() { return this.mainStore.applicationUser.coverageLookupAttempts >= 11; }, - mask() { - return { - mask: 'x##-###-####', - tokens: { - x: { - pattern: /[2-9]/ - } - } - }; + phoneMask() { + return MaskaFormattedMasks.PHONE_NUMBER; } }, methods: { diff --git a/src/main.js b/src/main.js index 68987d2e..fa8cc769 100644 --- a/src/main.js +++ b/src/main.js @@ -4,7 +4,7 @@ import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'; import { useMainStore } from '@/store'; import baseMixin from '@/mixins/base-mixin'; import { createPinia } from 'pinia'; -import Maska from 'maska'; +import { vMaska } from 'maska'; import LoadScript from 'vue-plugin-load-script'; import analyticsMixin from '@/mixins/analytics-mixin'; @@ -29,8 +29,8 @@ useMainStore().populateInitialState(); // Additional Vue items to setup vueApp.use(router); -vueApp.use(Maska); vueApp.use(LoadScript); +vueApp.directive('maska', vMaska); vueApp.mixin(baseMixin); vueApp.mixin(analyticsMixin); vueApp.mixin(experimentMixin);