From d38ae55e3e973be776bcb17d7b924a1160de3e0e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 02:06:20 +0000 Subject: [PATCH 01/13] Bump yaml from 1.10.2 to 1.10.3 Bumps [yaml](https://github.com/eemeli/yaml) from 1.10.2 to 1.10.3. - [Release notes](https://github.com/eemeli/yaml/releases) - [Commits](https://github.com/eemeli/yaml/compare/v1.10.2...v1.10.3) --- updated-dependencies: - dependency-name: yaml dependency-version: 1.10.3 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index df67185e..6f1932a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8048,7 +8048,9 @@ } }, "node_modules/cosmiconfig/node_modules/yaml": { - "version": "1.10.2", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", "dev": true, "license": "ISC", "engines": { @@ -8341,7 +8343,9 @@ } }, "node_modules/cssnano/node_modules/yaml": { - "version": "1.10.2", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", "dev": true, "license": "ISC", "engines": { From 1e3792b52f6a20ec066a3dccef44786e88cbf510 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 03:54:58 +0000 Subject: [PATCH 02/13] Bump picomatch Bumps and [picomatch](https://github.com/micromatch/picomatch). These dependencies needed to be updated together. Updates `picomatch` from 4.0.3 to 4.0.4 - [Release notes](https://github.com/micromatch/picomatch/releases) - [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/picomatch/compare/4.0.3...4.0.4) Updates `picomatch` from 2.3.1 to 2.3.2 - [Release notes](https://github.com/micromatch/picomatch/releases) - [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/picomatch/compare/4.0.3...4.0.4) --- updated-dependencies: - dependency-name: picomatch dependency-version: 4.0.4 dependency-type: indirect - dependency-name: picomatch dependency-version: 2.3.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index df67185e..25635dde 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3925,9 +3925,9 @@ } }, "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -16769,7 +16769,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -19734,7 +19736,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -20483,7 +20487,9 @@ } }, "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -20565,7 +20571,9 @@ } }, "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.3", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { From 716da2b5ceaad48547c72fddffe1742138ef87c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 03:49:25 +0000 Subject: [PATCH 03/13] Bump node-forge from 1.3.2 to 1.4.0 Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.3.2 to 1.4.0. - [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md) - [Commits](https://github.com/digitalbazaar/forge/compare/v1.3.2...v1.4.0) --- updated-dependencies: - dependency-name: node-forge dependency-version: 1.4.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index df67185e..8afe0f16 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16002,7 +16002,9 @@ } }, "node_modules/node-forge": { - "version": "1.3.2", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", + "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", "dev": true, "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { From 9181ef88f327c78612cf10bc890f679588fb6536 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 13:57:20 +0000 Subject: [PATCH 04/13] Bump brace-expansion Bumps and [brace-expansion](https://github.com/juliangruber/brace-expansion). These dependencies needed to be updated together. Updates `brace-expansion` from 1.1.12 to 1.1.13 - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](https://github.com/juliangruber/brace-expansion/compare/v1.1.12...v1.1.13) Updates `brace-expansion` from 2.0.2 to 2.0.3 - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](https://github.com/juliangruber/brace-expansion/compare/v1.1.12...v1.1.13) --- updated-dependencies: - dependency-name: brace-expansion dependency-version: 1.1.13 dependency-type: indirect - dependency-name: brace-expansion dependency-version: 2.0.3 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9ecec093..2f2a87a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4696,9 +4696,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "license": "MIT", "dependencies": { @@ -4842,7 +4842,9 @@ } }, "node_modules/@vitest/coverage-v8/node_modules/brace-expansion": { - "version": "2.0.2", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "license": "MIT", "dependencies": { @@ -7017,7 +7019,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -8966,7 +8970,9 @@ } }, "node_modules/editorconfig/node_modules/brace-expansion": { - "version": "2.0.2", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "license": "MIT", "dependencies": { @@ -14672,7 +14678,9 @@ } }, "node_modules/js-beautify/node_modules/brace-expansion": { - "version": "2.0.2", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "license": "MIT", "dependencies": { From bd20d47849802aefa4cbcd6a99ba8e12684c89c4 Mon Sep 17 00:00:00 2001 From: Katie Kroell Date: Fri, 27 Mar 2026 13:08:45 -0400 Subject: [PATCH 05/13] fix Labor2 part being added to order --- src/store/index.js | 7 +++++-- src/store/store.spec.js | 10 +--------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index aa56015a..da14e3dd 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1934,6 +1934,9 @@ export const useMainStore = defineStore({ this.updateMobileFee(fee); } else if (fee.partNumber === partNumberStrings.RECYCLE_FEE) { this.updateRecycleFee(fee); + } else if (fee.partNumber === partNumberStrings.LABOR2) { + // Do not add Labor2 to feeItems since it's already been added to supportingItems + this.addPartTypeFeeItem(null, partNumberStrings.LABOR2); } else { this.addPartNumberFeeItem(fee, fee.partNumber); } @@ -1948,8 +1951,8 @@ export const useMainStore = defineStore({ // Process Recycle Fee this.updateRecycleFee(partsData.find((rf) => rf.partNumber === partNumberStrings.RECYCLE_FEE)); - // Remove RecycleFee and Labor2 from supporting items as they're saved in feeItems; - this.order.lineItems.supportingItems = partsData.filter((i) => i.partNumber !== partNumberStrings.RECYCLE_FEE && i.partNumber !== partNumberStrings.LABOR2); + // Remove RecycleFee from supporting items since it's already been added to feeItems + this.order.lineItems.supportingItems = partsData.filter((i) => i.partNumber !== partNumberStrings.RECYCLE_FEE); }, updateVaps(partsData) { diff --git a/src/store/store.spec.js b/src/store/store.spec.js index bd601c24..2c6312da 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -2490,16 +2490,12 @@ describe('Store', () => { }); }); describe('updateSupportingItems method', () => { - it('updateSupportingItems removes Recyle Fee and Labor2 Fee from supporting items in store', () => { + it('updateSupportingItems removes Recyle Fee from supporting items in store', () => { // Arrange const partsData = [ { partNumber: 'RECYCLE FEE', partType: 'REPLACE FEE' - }, - { - partNumber: 'LABOR2', - partType: 'NON_GLASS' } ]; @@ -2511,10 +2507,6 @@ describe('Store', () => { partNumber: 'RECYCLE FEE', partType: 'REPLACE FEE' }); - expect.not.objectContaining({ - partNumber: 'LABOR2', - partType: 'NON_GLASS' - }); }); }); }); From 53e7e640c5032b5dfdb45602c0382f1f1e3b171e Mon Sep 17 00:00:00 2001 From: katiekroell <100247286+katiekroell@users.noreply.github.com> Date: Fri, 27 Mar 2026 13:28:49 -0400 Subject: [PATCH 06/13] Update src/store/index.js Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/store/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/index.js b/src/store/index.js index da14e3dd..5b5b2f57 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1936,7 +1936,7 @@ export const useMainStore = defineStore({ this.updateRecycleFee(fee); } else if (fee.partNumber === partNumberStrings.LABOR2) { // Do not add Labor2 to feeItems since it's already been added to supportingItems - this.addPartTypeFeeItem(null, partNumberStrings.LABOR2); + this.addPartNumberFeeItem(null, partNumberStrings.LABOR2); } else { this.addPartNumberFeeItem(fee, fee.partNumber); } From 5fc719849e8e4c6c2adb1257035c9602694bbc1d Mon Sep 17 00:00:00 2001 From: katiekroell <100247286+katiekroell@users.noreply.github.com> Date: Fri, 27 Mar 2026 13:29:13 -0400 Subject: [PATCH 07/13] Update src/store/store.spec.js Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/store/store.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 2c6312da..1050301c 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -2490,7 +2490,7 @@ describe('Store', () => { }); }); describe('updateSupportingItems method', () => { - it('updateSupportingItems removes Recyle Fee from supporting items in store', () => { + it('updateSupportingItems removes Recycle Fee from supporting items in store', () => { // Arrange const partsData = [ { From 2d00e6e1c14b88da9c1904363678d15f2086060b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 27 Mar 2026 17:31:42 +0000 Subject: [PATCH 08/13] Fix ineffective test assertion in updateSupportingItems test Agent-Logs-Url: https://github.com/Safelite/DigitalConsumer.ISS/sessions/fb2f46f9-6e42-4502-8833-3d3cae89de85 Co-authored-by: katiekroell <100247286+katiekroell@users.noreply.github.com> --- src/store/store.spec.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 1050301c..551f0c9b 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -2503,10 +2503,14 @@ describe('Store', () => { store.updateSupportingItems(partsData); // Assert - expect.not.objectContaining({ - partNumber: 'RECYCLE FEE', - partType: 'REPLACE FEE' - }); + expect(store.order.lineItems.supportingItems).not.toEqual( + expect.arrayContaining([ + expect.objectContaining({ + partNumber: 'RECYCLE FEE', + partType: 'REPLACE FEE' + }) + ]) + ); }); }); }); From ce3ff6e6b4a924f2f778d194f6dcacfecb61cd0b Mon Sep 17 00:00:00 2001 From: Katie Kroell Date: Fri, 27 Mar 2026 14:21:58 -0400 Subject: [PATCH 09/13] add unit test --- src/store/store.spec.js | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 551f0c9b..38a52c16 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -2513,4 +2513,28 @@ describe('Store', () => { ); }); }); -}); + describe('updateGlassFees method', () => { + it('updateGlassFees does not add Labor2 fee to feeItems', () => { + // Arrange + const feeData = [ + { + partNumber: 'LABOR2', + partType: 'LABOR FEE' + } + ]; + + // Act + store.updateGlassFees(feeData); + + // Assert + expect(store.order.lineItems.feeItems).not.toEqual( + expect.arrayContaining([ + expect.objectContaining({ + partNumber: 'LABOR2', + partType: 'LABOR FEE' + }) + ]) + ); + }); + }); +}); \ No newline at end of file From 6a3cb92013a53496a736afb3b75ebdf237e35a07 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 11:39:00 +0000 Subject: [PATCH 10/13] Bump path-to-regexp from 0.1.12 to 0.1.13 Bumps [path-to-regexp](https://github.com/pillarjs/path-to-regexp) from 0.1.12 to 0.1.13. - [Release notes](https://github.com/pillarjs/path-to-regexp/releases) - [Changelog](https://github.com/pillarjs/path-to-regexp/blob/v.0.1.13/History.md) - [Commits](https://github.com/pillarjs/path-to-regexp/compare/v0.1.12...v.0.1.13) --- updated-dependencies: - dependency-name: path-to-regexp dependency-version: 0.1.13 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 9ecec093..8b42b29d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16745,7 +16745,9 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.12", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", "dev": true, "license": "MIT" }, From 247237ba4825eabc7442ba09ad59c1c364abff1d Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Tue, 31 Mar 2026 13:09:10 -0400 Subject: [PATCH 11/13] updates for mobile first popup --- src/constants/experiments.js | 11 ++++++++++- src/helpers/service-location-helper.js | 15 +++++++++++++++ src/layouts/schedule-page/schedule-page.vue | 18 ++++++++++++++---- src/mixins/experiment-mixin.js | 10 ++++++++++ src/store/index.js | 3 +-- 5 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/constants/experiments.js b/src/constants/experiments.js index c336503b..1c0edd15 100644 --- a/src/constants/experiments.js +++ b/src/constants/experiments.js @@ -19,9 +19,18 @@ const experimentSettings = Object.freeze({ ISS_ENABLE_ADYEN_V1: 'ISS_Enable_Adyen_V1' }); +const experimentTest = Object.freeze({ + ISS_MOBILE_FIRST_POPUP_V3: 'ISS_Mobile_First_Popup_V3' +}); + +const experimentVariation = Object.freeze({ + ISS_MOBILE_FIRST_CONTROL_V3: 'NoShowMobileFirstPopUp_V3_CONTROL', + ISS_MOBILE_FIRST_TEST_V3: 'YesShowMobileFirstPopUp_V3_TEST' +}); + const experimentTriggers = Object.freeze({ SITE_ENTRY: 'SiteEntry', PAGE_ENTRY: 'PageEntry' }); -export { experimentUniverses, experimentSettings, experimentTriggers }; +export { experimentUniverses, experimentSettings, experimentTest, experimentVariation, experimentTriggers }; diff --git a/src/helpers/service-location-helper.js b/src/helpers/service-location-helper.js index 13aced81..12fc8589 100644 --- a/src/helpers/service-location-helper.js +++ b/src/helpers/service-location-helper.js @@ -73,6 +73,21 @@ export async function getZipCodeData(zipCode) { return await processZipCodeResults(useMainStore().validateZip({ zip: zipCode })); } +export function isServicableMobileWithData(isGlassServiceableMobile, isRecalibrationServiceableMobile) { + const isBigTruck = useMainStore().order.serviceLocation.isBigTruck; + if (isBigTruck) { + return false; + } + + if (isRecalibrationServiceableMobile !== null) { + return ( + isGlassServiceableMobile + && isRecalibrationServiceableMobile + ); + } + return !!isGlassServiceableMobile; +} + export function mapTimeSlot(timeSlot, timeOfDay) { return { ...timeSlot, diff --git a/src/layouts/schedule-page/schedule-page.vue b/src/layouts/schedule-page/schedule-page.vue index f0b1a150..8fb784ed 100644 --- a/src/layouts/schedule-page/schedule-page.vue +++ b/src/layouts/schedule-page/schedule-page.vue @@ -77,7 +77,7 @@ import siteFooter from '@/iss-components/site-footer/site-footer.vue'; import suggestTimeslotModal from '@/layouts/schedule-page/suggest-timeslot-modal/suggest-timeslot-modal.vue'; // Supporting files -import { experimentSettings, experimentUniverses } from '@/constants/experiments'; +import { experimentSettings, experimentTest, experimentVariation, experimentUniverses } from '@/constants/experiments'; import { AppointmentTypeStrings, GET_MOBILE_TIME_SLOTS, @@ -99,6 +99,7 @@ import { getPricedMobileFeePart, getMobileZipCodeData, getZipCodeData, + isServicableMobileWithData, mapTimeSlot } from '@/helpers/service-location-helper'; import { Form } from 'vee-validate'; @@ -337,7 +338,7 @@ export default { mobileProviderNumber: resultMap.providers?.mobileProviderNumber, serviceabilityDetails: resultMap.serviceabilityDetails, zipCode: initialServiceLocationObj.zipCode - } + }; vm.setCmsContent(resultMap.cmsContent); vm.$refs.serviceLocation.initializeComponent(serviceLocationData); @@ -492,12 +493,17 @@ export default { ); }, async checkMobileFirstExperience(mobileFirstObject = {}) { + const mobileFirstExperimentVariation = this.getExperimentVariationNameByTestName(experimentTest.ISS_MOBILE_FIRST_POPUP_V3); + const isMobileFirstTestVariation = mobileFirstExperimentVariation === experimentVariation.ISS_MOBILE_FIRST_TEST_V3; const showMobileFirst = this.getSettingValue(experimentSettings.ISS_MOBILE_FIRST_SHOW_FIRST_MOBILE_APPOINTMENT); if (showMobileFirst) { const pmMobileDaysLimit = this.getSettingValue(experimentSettings.ISS_MOBILE_FIRST_MAX_PM_MOBILE_DAYS); const mobileDaysLimit = this.getSettingValue(experimentSettings.ISS_MOBILE_FIRST_MAX_MOBILE_DAYS); const hasSelectedDate = !!this.getSelectedDate(); - const isServicableMobile = mobileFirstObject.serviceabilityDetails?.isGlassServiceableMobile; + const isServicableMobile = isServicableMobileWithData( + mobileFirstObject.serviceabilityDetails?.isGlassServiceableMobile, + mobileFirstObject.serviceabilityDetails?.isRecalibrationServiceableMobile + ); if (!hasSelectedDate && isServicableMobile && mobileFirstObject.mobileProviderNumber && mobileFirstObject.zipCode) { const todayDateObject = new Date(); const todayDateString = convertDateToDateString(todayDateObject); @@ -624,7 +630,11 @@ export default { this.mainStore.logMobileFirstExperimentExposure(); } - this.$refs[SUGGEST_TIMESLOT_MODAL_REF_NAME].openModal(timeSlotForAutoSelectionMobile); + if (isMobileFirstTestVariation) { + this.$refs[SUGGEST_TIMESLOT_MODAL_REF_NAME].openModal(timeSlotForAutoSelectionMobile); + } else { + console.log('In Control group or experiment not found, skip showing popup'); + } } } } diff --git a/src/mixins/experiment-mixin.js b/src/mixins/experiment-mixin.js index 7f9a761e..6668722b 100644 --- a/src/mixins/experiment-mixin.js +++ b/src/mixins/experiment-mixin.js @@ -12,6 +12,16 @@ export default { const experiment = useMainStore().applicationUser.experiments.find((e) => e.universeName === experimentName); return experiment ? experiment : null; }, + getExperimentByTestName(testName) { + return useMainStore().applicationUser.experiments.find((experiment) => experiment.testName === testName); + }, + getExperimentVariationNameByTestName(testName) { + const experimentByTestName = this.getExperimentByTestName(testName); + if (!experimentByTestName) { + return null; + } + return experimentByTestName.variationName; + }, getSettingValue(settingName) { return this.hasSetting(settingName) ? useMainStore().experimentSettings[settingName] diff --git a/src/store/index.js b/src/store/index.js index 5b5b2f57..f3b21047 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -2795,7 +2795,6 @@ export const useMainStore = defineStore({ ); }, - updateContactInfo(contactInfo) { this.order.customer.firstName = contactInfo?.firstName ?? this.order.customer.firstName; this.order.customer.lastName = contactInfo?.lastName ?? this.order.customer.lastName; @@ -3087,7 +3086,7 @@ export const useMainStore = defineStore({ }); return response.data; }, - + hasSubmittedOrder() { return window.sessionStorage.getItem(webStorageConstants.SUBMITTED_ORDER) !== null; }, From b6402788334a23a251d5fe227fe94190ae041b5a Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Tue, 31 Mar 2026 13:31:36 -0400 Subject: [PATCH 12/13] copilot updates --- src/helpers/service-location-helper.js | 2 +- src/layouts/schedule-page/schedule-page.vue | 10 +++++----- src/mixins/experiment-mixin.js | 3 ++- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/helpers/service-location-helper.js b/src/helpers/service-location-helper.js index 12fc8589..2c074a3a 100644 --- a/src/helpers/service-location-helper.js +++ b/src/helpers/service-location-helper.js @@ -73,7 +73,7 @@ export async function getZipCodeData(zipCode) { return await processZipCodeResults(useMainStore().validateZip({ zip: zipCode })); } -export function isServicableMobileWithData(isGlassServiceableMobile, isRecalibrationServiceableMobile) { +export function isServiceableMobileWithData(isGlassServiceableMobile, isRecalibrationServiceableMobile) { const isBigTruck = useMainStore().order.serviceLocation.isBigTruck; if (isBigTruck) { return false; diff --git a/src/layouts/schedule-page/schedule-page.vue b/src/layouts/schedule-page/schedule-page.vue index 8fb784ed..2e65643b 100644 --- a/src/layouts/schedule-page/schedule-page.vue +++ b/src/layouts/schedule-page/schedule-page.vue @@ -99,7 +99,7 @@ import { getPricedMobileFeePart, getMobileZipCodeData, getZipCodeData, - isServicableMobileWithData, + isServiceableMobileWithData, mapTimeSlot } from '@/helpers/service-location-helper'; import { Form } from 'vee-validate'; @@ -500,11 +500,11 @@ export default { const pmMobileDaysLimit = this.getSettingValue(experimentSettings.ISS_MOBILE_FIRST_MAX_PM_MOBILE_DAYS); const mobileDaysLimit = this.getSettingValue(experimentSettings.ISS_MOBILE_FIRST_MAX_MOBILE_DAYS); const hasSelectedDate = !!this.getSelectedDate(); - const isServicableMobile = isServicableMobileWithData( - mobileFirstObject.serviceabilityDetails?.isGlassServiceableMobile, - mobileFirstObject.serviceabilityDetails?.isRecalibrationServiceableMobile + const isServiceableMobile = isServiceableMobileWithData( + mobileFirstObject.serviceabilityDetails?.isGlassServiceableMobile ?? null, + mobileFirstObject.serviceabilityDetails?.isRecalibrationServiceableMobile ?? null ); - if (!hasSelectedDate && isServicableMobile && mobileFirstObject.mobileProviderNumber && mobileFirstObject.zipCode) { + if (!hasSelectedDate && isServiceableMobile && mobileFirstObject.mobileProviderNumber && mobileFirstObject.zipCode) { const todayDateObject = new Date(); const todayDateString = convertDateToDateString(todayDateObject); const calendarViewDirection = 'future'; diff --git a/src/mixins/experiment-mixin.js b/src/mixins/experiment-mixin.js index 6668722b..fab87d88 100644 --- a/src/mixins/experiment-mixin.js +++ b/src/mixins/experiment-mixin.js @@ -13,7 +13,8 @@ export default { return experiment ? experiment : null; }, getExperimentByTestName(testName) { - return useMainStore().applicationUser.experiments.find((experiment) => experiment.testName === testName); + const experiment = useMainStore().applicationUser.experiments.find((experiment) => experiment.testName === testName); + return experiment ? experiment : null; }, getExperimentVariationNameByTestName(testName) { const experimentByTestName = this.getExperimentByTestName(testName); From c6d4cf32caa1dea7a504956b98e1cb26ac339283 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Tue, 31 Mar 2026 14:13:43 -0400 Subject: [PATCH 13/13] readability null means car doesnt check recal --- src/helpers/service-location-helper.js | 2 +- src/layouts/schedule-page/service-location/service-location.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/helpers/service-location-helper.js b/src/helpers/service-location-helper.js index 2c074a3a..5da94148 100644 --- a/src/helpers/service-location-helper.js +++ b/src/helpers/service-location-helper.js @@ -79,7 +79,7 @@ export function isServiceableMobileWithData(isGlassServiceableMobile, isRecalibr return false; } - if (isRecalibrationServiceableMobile !== null) { + if (isRecalibrationServiceableMobile === true || isRecalibrationServiceableMobile === false) { return ( isGlassServiceableMobile && isRecalibrationServiceableMobile diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index 227c20bb..7476acd1 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -252,7 +252,7 @@ export default { return false; } - if (this.isRecalibrationServiceableMobile !== null) { + if (this.isRecalibrationServiceableMobile === true || this.isRecalibrationServiceableMobile === false) { return ( this.isGlassServiceableMobile && this.isRecalibrationServiceableMobile