Merge branch 'develop' into feature/CSR-1392
This commit is contained in:
commit
60f6110341
8 changed files with 678 additions and 339 deletions
|
|
@ -1,303 +1,305 @@
|
||||||
trigger:
|
trigger:
|
||||||
branches:
|
branches:
|
||||||
include: [develop, release/*]
|
include: [develop, release/*]
|
||||||
paths:
|
paths:
|
||||||
exclude:
|
exclude:
|
||||||
- deployment/*
|
- deployment/*
|
||||||
include:
|
include:
|
||||||
- "*"
|
- "*"
|
||||||
pr:
|
pr:
|
||||||
branches:
|
branches:
|
||||||
include: ["*"]
|
include: ["*"]
|
||||||
paths:
|
paths:
|
||||||
exclude:
|
exclude:
|
||||||
- deployment/*
|
- deployment/*
|
||||||
include:
|
include:
|
||||||
- "*"
|
- "*"
|
||||||
|
|
||||||
resources:
|
resources:
|
||||||
containers:
|
containers:
|
||||||
- container: node
|
- container: node
|
||||||
image: packagerepository.sagaws.net:8082/safelite/node-build:15
|
image: packagerepository.sagaws.net:8082/safelite/node-build:15
|
||||||
- container: awscli
|
- container: awscli
|
||||||
image: packagerepository.sagaws.net:8082/safelite/awscli2-build:3.9
|
image: packagerepository.sagaws.net:8082/safelite/awscli2-build:3.9
|
||||||
- container: prettier-node
|
- container: prettier-node
|
||||||
image: packagerepository.sagaws.net:8082/safelite/prettier-node-build:18
|
image: packagerepository.sagaws.net:8082/safelite/prettier-node-build:18
|
||||||
repositories:
|
repositories:
|
||||||
- repository: AzureDevOps
|
- repository: AzureDevOps
|
||||||
type: github
|
type: github
|
||||||
name: Safelite/AzureDevOps
|
name: Safelite/AzureDevOps
|
||||||
endpoint: Safelite
|
endpoint: Safelite
|
||||||
ref: refs/tags/t5.5.40
|
ref: refs/tags/t5.5.40
|
||||||
|
|
||||||
variables:
|
variables:
|
||||||
- group: Digital-Infrastructure
|
- group: Digital-Infrastructure
|
||||||
- group: FixMyGlass-BuildBranches
|
- group: FixMyGlass-BuildBranches
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
# PR's
|
# PR's
|
||||||
- ${{ if eq(variables['Build.Reason'], 'PullRequest') }}:
|
- ${{ if eq(variables['Build.Reason'], 'PullRequest') }}:
|
||||||
- stage: TestFormat
|
- stage: TestFormat
|
||||||
displayName: Test Code Format
|
displayName: Test Code Format
|
||||||
jobs:
|
jobs:
|
||||||
- job: checkFormatting
|
- job: checkFormatting
|
||||||
displayName: Check formatting
|
displayName: Check formatting
|
||||||
container: prettier-node
|
container: prettier-node
|
||||||
steps:
|
|
||||||
- bash: prettier --check "$(Build.SourcesDirectory)/src/**/*.(js|vue)"
|
|
||||||
displayName: Run Prettier check
|
|
||||||
|
|
||||||
- stage: TestPr
|
|
||||||
displayName: Run Unit Tests For PullRequest
|
|
||||||
jobs:
|
|
||||||
- template: templates/digital/vue-jest-run-unit-tests.yml@AzureDevOps
|
|
||||||
parameters:
|
|
||||||
nodeContainer: node
|
|
||||||
npmLocation: $(Build.SourcesDirectory)
|
|
||||||
testResultsFile: junit.xml
|
|
||||||
summaryFileLocation: $(Build.SourcesDirectory)/coverage/cobertura-coverage.xml
|
|
||||||
- ${{ else }}:
|
|
||||||
# Dev Build/Deploy
|
|
||||||
- stage: Dev
|
|
||||||
condition: eq(variables['Build.SourceBranch'], variables['dev-branch'] )
|
|
||||||
variables:
|
|
||||||
- group: FixMyGlassDev
|
|
||||||
jobs:
|
|
||||||
- deployment: devBuildDeployment
|
|
||||||
displayName: Build and Deploy FMG - Dev
|
|
||||||
environment: digitalCloud-dev
|
|
||||||
container: node
|
|
||||||
workspace:
|
|
||||||
clean: all
|
|
||||||
strategy:
|
|
||||||
runOnce:
|
|
||||||
deploy:
|
|
||||||
steps:
|
steps:
|
||||||
- checkout: self
|
- bash: prettier --check "$(Build.SourcesDirectory)/src/**/*.(js|vue)"
|
||||||
clean: true
|
displayName: Run Prettier check
|
||||||
- template: templates/digital/step-build-vue.yml@AzureDevOps
|
|
||||||
parameters:
|
|
||||||
buildOutputDir: dist
|
|
||||||
environment: Dev
|
|
||||||
- template: templates/digital/step-deploy-vue.yml@AzureDevOps
|
|
||||||
parameters:
|
|
||||||
artifactName: vueDistDev
|
|
||||||
awsProfile: $(devDeploymentProfile)
|
|
||||||
outputPath: /fmg/
|
|
||||||
deployBuckets:
|
|
||||||
safelite-dev-fmg-us-east-1:
|
|
||||||
clearFolder: true
|
|
||||||
deployFolder: ""
|
|
||||||
region: us-east-1
|
|
||||||
safelite-dev-fmg-us-east-2:
|
|
||||||
clearFolder: true
|
|
||||||
deployFolder: ""
|
|
||||||
region: us-east-2
|
|
||||||
appDeployVariables:
|
|
||||||
__VUE_APP_CONSUMER_CF_DISTRO__: $(__VUE_APP_CONSUMER_CF_DISTRO__)
|
|
||||||
__VUE_APP_GOOGLE_PLACES_API_KEY__: $(__VUE_APP_GOOGLE_PLACES_API_KEY__)
|
|
||||||
__VUE_APP_HERITAGE_FUNNEL__: $(__VUE_APP_HERITAGE_FUNNEL__)
|
|
||||||
__VUE_APP_SAFELITE_HOP___: $(__VUE_APP_SAFELITE_HOP__)
|
|
||||||
__VUE_APP_PAYPAL_SUCCESS_URL__: $(__VUE_APP_PAYPAL_SUCCESS_URL__)
|
|
||||||
__VUE_APP_PAYPAL_CANCEL_URL__: $(__VUE_APP_PAYPAL_CANCEL_URL__)
|
|
||||||
__VUE_APP_CURRENT_ENVIRONMENT__: $(__VUE_APP_CURRENT_ENVIRONMENT__)
|
|
||||||
indexDeployVariables:
|
|
||||||
__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__: $(__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__)
|
|
||||||
__VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC__: $(__VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC__)
|
|
||||||
- template: templates/digital/invalidate-cloudfront-cache.yml@AzureDevOps
|
|
||||||
parameters:
|
|
||||||
awsCliContainer: awscli
|
|
||||||
distributionId: $(apiCfDistributionId)
|
|
||||||
paths: /*
|
|
||||||
awsProfile: $(devDeploymentProfile)
|
|
||||||
- template: templates/digital/invalidate-cloudfront-cache.yml@AzureDevOps
|
|
||||||
parameters:
|
|
||||||
awsCliContainer: awscli
|
|
||||||
distributionId: $(cfDistributionId)
|
|
||||||
paths: /fmg/*
|
|
||||||
awsProfile: $(devDeploymentProfile)
|
|
||||||
|
|
||||||
# Test Build/Deploy
|
- stage: TestPr
|
||||||
- stage: Test
|
displayName: Run Unit Tests For PullRequest
|
||||||
condition: eq(variables['Build.SourceBranch'], variables['test-branch'] )
|
jobs:
|
||||||
variables:
|
- template: templates/digital/vue-jest-run-unit-tests.yml@AzureDevOps
|
||||||
- group: FixMyGlassTest
|
parameters:
|
||||||
jobs:
|
nodeContainer: node
|
||||||
- deployment: testBuildDeployment
|
npmLocation: $(Build.SourcesDirectory)
|
||||||
displayName: Build and Deploy FMG - Test
|
testResultsFile: junit.xml
|
||||||
environment: NoApproval-All
|
summaryFileLocation: $(Build.SourcesDirectory)/coverage/cobertura-coverage.xml
|
||||||
container: node
|
- ${{ else }}:
|
||||||
workspace:
|
# Dev Build/Deploy
|
||||||
clean: all
|
- stage: Dev
|
||||||
strategy:
|
condition: eq(variables['Build.SourceBranch'], variables['dev-branch'] )
|
||||||
runOnce:
|
variables:
|
||||||
deploy:
|
- group: FixMyGlassDev
|
||||||
steps:
|
jobs:
|
||||||
- checkout: self
|
- deployment: devBuildDeployment
|
||||||
clean: true
|
displayName: Build and Deploy FMG - Dev
|
||||||
- template: templates/digital/step-build-vue.yml@AzureDevOps
|
environment: digitalCloud-dev
|
||||||
parameters:
|
container: node
|
||||||
buildOutputDir: dist
|
workspace:
|
||||||
environment: Test
|
clean: all
|
||||||
- template: templates/digital/step-deploy-vue.yml@AzureDevOps
|
strategy:
|
||||||
parameters:
|
runOnce:
|
||||||
artifactName: vueDistTest
|
deploy:
|
||||||
awsProfile: $(sysDeploymentProfile)
|
steps:
|
||||||
outputPath: /fmg/
|
- checkout: self
|
||||||
deployBuckets:
|
clean: true
|
||||||
safelite-sys-fmg-us-east-1:
|
- template: templates/digital/step-build-vue.yml@AzureDevOps
|
||||||
clearFolder: true
|
parameters:
|
||||||
deployFolder: ""
|
buildOutputDir: dist
|
||||||
region: us-east-1
|
environment: Dev
|
||||||
safelite-sys-fmg-us-east-2:
|
- template: templates/digital/step-deploy-vue.yml@AzureDevOps
|
||||||
clearFolder: true
|
parameters:
|
||||||
deployFolder: ""
|
artifactName: vueDistDev
|
||||||
region: us-east-2
|
awsProfile: $(devDeploymentProfile)
|
||||||
appDeployVariables:
|
outputPath: /fmg/
|
||||||
__VUE_APP_CONSUMER_CF_DISTRO__: $(__VUE_APP_CONSUMER_CF_DISTRO__)
|
deployBuckets:
|
||||||
__VUE_APP_GOOGLE_PLACES_API_KEY__: $(__VUE_APP_GOOGLE_PLACES_API_KEY__)
|
safelite-dev-fmg-us-east-1:
|
||||||
__VUE_APP_HERITAGE_FUNNEL__: $(__VUE_APP_HERITAGE_FUNNEL__)
|
clearFolder: true
|
||||||
__VUE_APP_SAFELITE_HOP___: $(__VUE_APP_SAFELITE_HOP__)
|
deployFolder: ""
|
||||||
__VUE_APP_PAYPAL_SUCCESS_URL__: $(__VUE_APP_PAYPAL_SUCCESS_URL__)
|
region: us-east-1
|
||||||
__VUE_APP_PAYPAL_CANCEL_URL__: $(__VUE_APP_PAYPAL_CANCEL_URL__)
|
safelite-dev-fmg-us-east-2:
|
||||||
__VUE_APP_CURRENT_ENVIRONMENT__: $(__VUE_APP_CURRENT_ENVIRONMENT__)
|
clearFolder: true
|
||||||
indexDeployVariables:
|
deployFolder: ""
|
||||||
__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__: $(__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__)
|
region: us-east-2
|
||||||
__VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC__: $(__VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC__)
|
appDeployVariables:
|
||||||
- template: templates/digital/invalidate-cloudfront-cache.yml@AzureDevOps
|
__VUE_APP_CONSUMER_CF_DISTRO__: $(__VUE_APP_CONSUMER_CF_DISTRO__)
|
||||||
parameters:
|
__VUE_APP_GOOGLE_PLACES_API_KEY__: $(__VUE_APP_GOOGLE_PLACES_API_KEY__)
|
||||||
awsCliContainer: awscli
|
__VUE_APP_HERITAGE_FUNNEL__: $(__VUE_APP_HERITAGE_FUNNEL__)
|
||||||
distributionId: $(apiCfDistributionId)
|
__VUE_APP_SAFELITE_HOP___: $(__VUE_APP_SAFELITE_HOP__)
|
||||||
paths: /*
|
__VUE_APP_PAYPAL_SUCCESS_URL__: $(__VUE_APP_PAYPAL_SUCCESS_URL__)
|
||||||
awsProfile: $(sysDeploymentProfile)
|
__VUE_APP_PAYPAL_CANCEL_URL__: $(__VUE_APP_PAYPAL_CANCEL_URL__)
|
||||||
- template: templates/digital/invalidate-cloudfront-cache.yml@AzureDevOps
|
__VUE_APP_CURRENT_ENVIRONMENT__: $(__VUE_APP_CURRENT_ENVIRONMENT__)
|
||||||
parameters:
|
__VUE_APP_MY_ACCOUNT__: $(__VUE_APP_MY_ACCOUNT__)
|
||||||
awsCliContainer: awscli
|
indexDeployVariables:
|
||||||
distributionId: $(cfDistributionId)
|
__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__: $(__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__)
|
||||||
paths: /fmg/*
|
__VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC__: $(__VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC__)
|
||||||
awsProfile: $(sysDeploymentProfile)
|
- template: templates/digital/invalidate-cloudfront-cache.yml@AzureDevOps
|
||||||
|
parameters:
|
||||||
# QA Build/Deploy
|
awsCliContainer: awscli
|
||||||
- stage: Qa
|
distributionId: $(apiCfDistributionId)
|
||||||
condition: eq(variables['Build.SourceBranch'], variables['qa-branch'] )
|
paths: /*
|
||||||
variables:
|
awsProfile: $(devDeploymentProfile)
|
||||||
- group: FixMyGlassQa
|
- template: templates/digital/invalidate-cloudfront-cache.yml@AzureDevOps
|
||||||
jobs:
|
parameters:
|
||||||
- deployment: qaBuildDeployment
|
awsCliContainer: awscli
|
||||||
displayName: Build and Deploy FMG - QA
|
distributionId: $(cfDistributionId)
|
||||||
environment: NoApproval-All
|
paths: /fmg/*
|
||||||
container: node
|
awsProfile: $(devDeploymentProfile)
|
||||||
workspace:
|
|
||||||
clean: all
|
|
||||||
strategy:
|
|
||||||
runOnce:
|
|
||||||
deploy:
|
|
||||||
steps:
|
|
||||||
- checkout: self
|
|
||||||
clean: true
|
|
||||||
- template: templates/digital/step-build-vue.yml@AzureDevOps
|
|
||||||
parameters:
|
|
||||||
buildOutputDir: dist
|
|
||||||
environment: Qa
|
|
||||||
- template: templates/digital/step-deploy-vue.yml@AzureDevOps
|
|
||||||
parameters:
|
|
||||||
artifactName: vueDistQa
|
|
||||||
awsProfile: $(qaDeploymentProfile)
|
|
||||||
outputPath: /fmg/
|
|
||||||
deployBuckets:
|
|
||||||
safelite-qa-fmg-us-east-1:
|
|
||||||
clearFolder: true
|
|
||||||
deployFolder: ""
|
|
||||||
region: us-east-1
|
|
||||||
safelite-qa-fmg-us-east-2:
|
|
||||||
clearFolder: true
|
|
||||||
deployFolder: ""
|
|
||||||
region: us-east-2
|
|
||||||
appDeployVariables:
|
|
||||||
__VUE_APP_CONSUMER_CF_DISTRO__: $(__VUE_APP_CONSUMER_CF_DISTRO__)
|
|
||||||
__VUE_APP_GOOGLE_PLACES_API_KEY__: $(__VUE_APP_GOOGLE_PLACES_API_KEY__)
|
|
||||||
__VUE_APP_HERITAGE_FUNNEL__: $(__VUE_APP_HERITAGE_FUNNEL__)
|
|
||||||
__VUE_APP_SAFELITE_HOP___: $(__VUE_APP_SAFELITE_HOP__)
|
|
||||||
__VUE_APP_PAYPAL_SUCCESS_URL__: $(__VUE_APP_PAYPAL_SUCCESS_URL__)
|
|
||||||
__VUE_APP_PAYPAL_CANCEL_URL__: $(__VUE_APP_PAYPAL_CANCEL_URL__)
|
|
||||||
__VUE_APP_CURRENT_ENVIRONMENT__: $(__VUE_APP_CURRENT_ENVIRONMENT__)
|
|
||||||
indexDeployVariables:
|
|
||||||
__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__: $(__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__)
|
|
||||||
__VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC__: $(__VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC__)
|
|
||||||
- template: templates/digital/invalidate-cloudfront-cache.yml@AzureDevOps
|
|
||||||
parameters:
|
|
||||||
awsCliContainer: awscli
|
|
||||||
distributionId: $(apiCfDistributionId)
|
|
||||||
paths: /*
|
|
||||||
awsProfile: $(qaDeploymentProfile)
|
|
||||||
- template: templates/digital/invalidate-cloudfront-cache.yml@AzureDevOps
|
|
||||||
parameters:
|
|
||||||
awsCliContainer: awscli
|
|
||||||
distributionId: $(cfDistributionId)
|
|
||||||
paths: /fmg/*
|
|
||||||
awsProfile: $(qaDeploymentProfile)
|
|
||||||
|
|
||||||
# Prod Build/Deploy
|
# Test Build/Deploy
|
||||||
- stage: Prod
|
- stage: Test
|
||||||
condition: succeeded('Qa')
|
condition: eq(variables['Build.SourceBranch'], variables['test-branch'] )
|
||||||
variables:
|
variables:
|
||||||
- group: FixMyGlassProd
|
- group: FixMyGlassTest
|
||||||
jobs:
|
jobs:
|
||||||
- deployment: prodBuildDeployment
|
- deployment: testBuildDeployment
|
||||||
displayName: Build and Deploy FMG - Prod
|
displayName: Build and Deploy FMG - Test
|
||||||
environment: digitalCloud-prod
|
environment: NoApproval-All
|
||||||
container: node
|
container: node
|
||||||
workspace:
|
workspace:
|
||||||
clean: all
|
clean: all
|
||||||
strategy:
|
strategy:
|
||||||
runOnce:
|
runOnce:
|
||||||
deploy:
|
deploy:
|
||||||
steps:
|
steps:
|
||||||
- checkout: self
|
- checkout: self
|
||||||
clean: true
|
clean: true
|
||||||
- template: templates/digital/step-build-vue.yml@AzureDevOps
|
- template: templates/digital/step-build-vue.yml@AzureDevOps
|
||||||
parameters:
|
parameters:
|
||||||
buildOutputDir: dist
|
buildOutputDir: dist
|
||||||
environment: Prod
|
environment: Test
|
||||||
- template: templates/digital/step-deploy-vue.yml@AzureDevOps
|
- template: templates/digital/step-deploy-vue.yml@AzureDevOps
|
||||||
parameters:
|
parameters:
|
||||||
artifactName: vueDistProd
|
artifactName: vueDistTest
|
||||||
awsProfile: $(prodDeploymentProfile)
|
awsProfile: $(sysDeploymentProfile)
|
||||||
outputPath: /fmg/
|
outputPath: /fmg/
|
||||||
deployBuckets:
|
deployBuckets:
|
||||||
safelite-prod-fmg-us-east-1:
|
safelite-sys-fmg-us-east-1:
|
||||||
clearFolder: true
|
clearFolder: true
|
||||||
deployFolder: ""
|
deployFolder: ""
|
||||||
region: us-east-1
|
region: us-east-1
|
||||||
safelite-prod-fmg-us-east-2:
|
safelite-sys-fmg-us-east-2:
|
||||||
clearFolder: true
|
clearFolder: true
|
||||||
deployFolder: ""
|
deployFolder: ""
|
||||||
region: us-east-2
|
region: us-east-2
|
||||||
appDeployVariables:
|
appDeployVariables:
|
||||||
__VUE_APP_CONSUMER_CF_DISTRO__: $(__VUE_APP_CONSUMER_CF_DISTRO__)
|
__VUE_APP_CONSUMER_CF_DISTRO__: $(__VUE_APP_CONSUMER_CF_DISTRO__)
|
||||||
__VUE_APP_GOOGLE_PLACES_API_KEY__: $(__VUE_APP_GOOGLE_PLACES_API_KEY__)
|
__VUE_APP_GOOGLE_PLACES_API_KEY__: $(__VUE_APP_GOOGLE_PLACES_API_KEY__)
|
||||||
__VUE_APP_HERITAGE_FUNNEL__: $(__VUE_APP_HERITAGE_FUNNEL__)
|
__VUE_APP_HERITAGE_FUNNEL__: $(__VUE_APP_HERITAGE_FUNNEL__)
|
||||||
__VUE_APP_SAFELITE_HOP___: $(__VUE_APP_SAFELITE_HOP__)
|
__VUE_APP_SAFELITE_HOP___: $(__VUE_APP_SAFELITE_HOP__)
|
||||||
__VUE_APP_PAYPAL_SUCCESS_URL__: $(__VUE_APP_PAYPAL_SUCCESS_URL__)
|
__VUE_APP_PAYPAL_SUCCESS_URL__: $(__VUE_APP_PAYPAL_SUCCESS_URL__)
|
||||||
__VUE_APP_PAYPAL_CANCEL_URL__: $(__VUE_APP_PAYPAL_CANCEL_URL__)
|
__VUE_APP_PAYPAL_CANCEL_URL__: $(__VUE_APP_PAYPAL_CANCEL_URL__)
|
||||||
__VUE_APP_CURRENT_ENVIRONMENT__: $(__VUE_APP_CURRENT_ENVIRONMENT__)
|
__VUE_APP_CURRENT_ENVIRONMENT__: $(__VUE_APP_CURRENT_ENVIRONMENT__)
|
||||||
indexDeployVariables:
|
__VUE_APP_MY_ACCOUNT__: $(__VUE_APP_MY_ACCOUNT__)
|
||||||
__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__: $(__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__)
|
indexDeployVariables:
|
||||||
__VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC__: $(__VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC__)
|
__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__: $(__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__)
|
||||||
- template: templates/digital/invalidate-cloudfront-cache.yml@AzureDevOps
|
__VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC__: $(__VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC__)
|
||||||
parameters:
|
- template: templates/digital/invalidate-cloudfront-cache.yml@AzureDevOps
|
||||||
awsCliContainer: awscli
|
parameters:
|
||||||
distributionId: $(apiCfDistributionId)
|
awsCliContainer: awscli
|
||||||
paths: /*
|
distributionId: $(apiCfDistributionId)
|
||||||
awsProfile: $(prodDeploymentProfile)
|
paths: /*
|
||||||
- template: templates/digital/invalidate-cloudfront-cache.yml@AzureDevOps
|
awsProfile: $(sysDeploymentProfile)
|
||||||
parameters:
|
- template: templates/digital/invalidate-cloudfront-cache.yml@AzureDevOps
|
||||||
awsCliContainer: awscli
|
parameters:
|
||||||
distributionId: $(cfDistributionId)
|
awsCliContainer: awscli
|
||||||
paths: /fmg/*
|
distributionId: $(cfDistributionId)
|
||||||
awsProfile: $(prodDeploymentProfile)
|
paths: /fmg/*
|
||||||
- template: templates/digital/auto-tag.yml@AzureDevOps
|
awsProfile: $(sysDeploymentProfile)
|
||||||
parameters:
|
|
||||||
dependsOn: prodBuildDeployment
|
# QA Build/Deploy
|
||||||
userName: SafeliteAzureDevops
|
- stage: Qa
|
||||||
userEmail: githubazuredevops@safelite.com
|
condition: eq(variables['Build.SourceBranch'], variables['qa-branch'] )
|
||||||
|
variables:
|
||||||
|
- group: FixMyGlassQa
|
||||||
|
jobs:
|
||||||
|
- deployment: qaBuildDeployment
|
||||||
|
displayName: Build and Deploy FMG - QA
|
||||||
|
environment: NoApproval-All
|
||||||
|
container: node
|
||||||
|
workspace:
|
||||||
|
clean: all
|
||||||
|
strategy:
|
||||||
|
runOnce:
|
||||||
|
deploy:
|
||||||
|
steps:
|
||||||
|
- checkout: self
|
||||||
|
clean: true
|
||||||
|
- template: templates/digital/step-build-vue.yml@AzureDevOps
|
||||||
|
parameters:
|
||||||
|
buildOutputDir: dist
|
||||||
|
environment: Qa
|
||||||
|
- template: templates/digital/step-deploy-vue.yml@AzureDevOps
|
||||||
|
parameters:
|
||||||
|
artifactName: vueDistQa
|
||||||
|
awsProfile: $(qaDeploymentProfile)
|
||||||
|
outputPath: /fmg/
|
||||||
|
deployBuckets:
|
||||||
|
safelite-qa-fmg-us-east-1:
|
||||||
|
clearFolder: true
|
||||||
|
deployFolder: ""
|
||||||
|
region: us-east-1
|
||||||
|
safelite-qa-fmg-us-east-2:
|
||||||
|
clearFolder: true
|
||||||
|
deployFolder: ""
|
||||||
|
region: us-east-2
|
||||||
|
appDeployVariables:
|
||||||
|
__VUE_APP_CONSUMER_CF_DISTRO__: $(__VUE_APP_CONSUMER_CF_DISTRO__)
|
||||||
|
__VUE_APP_GOOGLE_PLACES_API_KEY__: $(__VUE_APP_GOOGLE_PLACES_API_KEY__)
|
||||||
|
__VUE_APP_HERITAGE_FUNNEL__: $(__VUE_APP_HERITAGE_FUNNEL__)
|
||||||
|
__VUE_APP_SAFELITE_HOP___: $(__VUE_APP_SAFELITE_HOP__)
|
||||||
|
__VUE_APP_PAYPAL_SUCCESS_URL__: $(__VUE_APP_PAYPAL_SUCCESS_URL__)
|
||||||
|
__VUE_APP_PAYPAL_CANCEL_URL__: $(__VUE_APP_PAYPAL_CANCEL_URL__)
|
||||||
|
__VUE_APP_CURRENT_ENVIRONMENT__: $(__VUE_APP_CURRENT_ENVIRONMENT__)
|
||||||
|
indexDeployVariables:
|
||||||
|
__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__: $(__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__)
|
||||||
|
__VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC__: $(__VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC__)
|
||||||
|
- template: templates/digital/invalidate-cloudfront-cache.yml@AzureDevOps
|
||||||
|
parameters:
|
||||||
|
awsCliContainer: awscli
|
||||||
|
distributionId: $(apiCfDistributionId)
|
||||||
|
paths: /*
|
||||||
|
awsProfile: $(qaDeploymentProfile)
|
||||||
|
- template: templates/digital/invalidate-cloudfront-cache.yml@AzureDevOps
|
||||||
|
parameters:
|
||||||
|
awsCliContainer: awscli
|
||||||
|
distributionId: $(cfDistributionId)
|
||||||
|
paths: /fmg/*
|
||||||
|
awsProfile: $(qaDeploymentProfile)
|
||||||
|
|
||||||
|
# Prod Build/Deploy
|
||||||
|
- stage: Prod
|
||||||
|
condition: succeeded('Qa')
|
||||||
|
variables:
|
||||||
|
- group: FixMyGlassProd
|
||||||
|
jobs:
|
||||||
|
- deployment: prodBuildDeployment
|
||||||
|
displayName: Build and Deploy FMG - Prod
|
||||||
|
environment: digitalCloud-prod
|
||||||
|
container: node
|
||||||
|
workspace:
|
||||||
|
clean: all
|
||||||
|
strategy:
|
||||||
|
runOnce:
|
||||||
|
deploy:
|
||||||
|
steps:
|
||||||
|
- checkout: self
|
||||||
|
clean: true
|
||||||
|
- template: templates/digital/step-build-vue.yml@AzureDevOps
|
||||||
|
parameters:
|
||||||
|
buildOutputDir: dist
|
||||||
|
environment: Prod
|
||||||
|
- template: templates/digital/step-deploy-vue.yml@AzureDevOps
|
||||||
|
parameters:
|
||||||
|
artifactName: vueDistProd
|
||||||
|
awsProfile: $(prodDeploymentProfile)
|
||||||
|
outputPath: /fmg/
|
||||||
|
deployBuckets:
|
||||||
|
safelite-prod-fmg-us-east-1:
|
||||||
|
clearFolder: true
|
||||||
|
deployFolder: ""
|
||||||
|
region: us-east-1
|
||||||
|
safelite-prod-fmg-us-east-2:
|
||||||
|
clearFolder: true
|
||||||
|
deployFolder: ""
|
||||||
|
region: us-east-2
|
||||||
|
appDeployVariables:
|
||||||
|
__VUE_APP_CONSUMER_CF_DISTRO__: $(__VUE_APP_CONSUMER_CF_DISTRO__)
|
||||||
|
__VUE_APP_GOOGLE_PLACES_API_KEY__: $(__VUE_APP_GOOGLE_PLACES_API_KEY__)
|
||||||
|
__VUE_APP_HERITAGE_FUNNEL__: $(__VUE_APP_HERITAGE_FUNNEL__)
|
||||||
|
__VUE_APP_SAFELITE_HOP___: $(__VUE_APP_SAFELITE_HOP__)
|
||||||
|
__VUE_APP_PAYPAL_SUCCESS_URL__: $(__VUE_APP_PAYPAL_SUCCESS_URL__)
|
||||||
|
__VUE_APP_PAYPAL_CANCEL_URL__: $(__VUE_APP_PAYPAL_CANCEL_URL__)
|
||||||
|
__VUE_APP_CURRENT_ENVIRONMENT__: $(__VUE_APP_CURRENT_ENVIRONMENT__)
|
||||||
|
indexDeployVariables:
|
||||||
|
__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__: $(__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__)
|
||||||
|
__VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC__: $(__VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC__)
|
||||||
|
- template: templates/digital/invalidate-cloudfront-cache.yml@AzureDevOps
|
||||||
|
parameters:
|
||||||
|
awsCliContainer: awscli
|
||||||
|
distributionId: $(apiCfDistributionId)
|
||||||
|
paths: /*
|
||||||
|
awsProfile: $(prodDeploymentProfile)
|
||||||
|
- template: templates/digital/invalidate-cloudfront-cache.yml@AzureDevOps
|
||||||
|
parameters:
|
||||||
|
awsCliContainer: awscli
|
||||||
|
distributionId: $(cfDistributionId)
|
||||||
|
paths: /fmg/*
|
||||||
|
awsProfile: $(prodDeploymentProfile)
|
||||||
|
- template: templates/digital/auto-tag.yml@AzureDevOps
|
||||||
|
parameters:
|
||||||
|
dependsOn: prodBuildDeployment
|
||||||
|
userName: SafeliteAzureDevops
|
||||||
|
userEmail: githubazuredevops@safelite.com
|
||||||
|
|
|
||||||
11
src/assets/img/icons/add-to-calendar.svg
Normal file
11
src/assets/img/icons/add-to-calendar.svg
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_14504_113611)">
|
||||||
|
<path d="M14.1762 1.52764H13.7656V1.50352C13.7656 1.10476 13.6076 0.722334 13.3263 0.44037C13.0451 0.158406 12.6636 0 12.2659 0C11.8681 0 11.4866 0.158406 11.2054 0.44037C10.9241 0.722334 10.7661 1.10476 10.7661 1.50352V1.52764H5.42476V1.50352C5.42476 1.10476 5.26675 0.722334 4.9855 0.44037C4.70424 0.158406 4.32277 0 3.92501 0C3.52725 0 3.14579 0.158406 2.86453 0.44037C2.58327 0.722334 2.42526 1.10476 2.42526 1.50352V1.52764H1.82376C1.34046 1.52891 0.877316 1.72195 0.53557 2.06455C0.193824 2.40716 0.00127018 2.87146 0 3.35598V14.1717C0.0016909 14.656 0.194379 15.1201 0.536035 15.4626C0.87769 15.8051 1.34059 15.9983 1.82376 16H14.1746C14.6581 15.9987 15.1214 15.8057 15.4634 15.4632C15.8054 15.1206 15.9983 14.6563 16 14.1717V3.35598C15.9987 2.87146 15.8062 2.40716 15.4644 2.06455C15.1227 1.72195 14.6595 1.52891 14.1762 1.52764ZM11.8889 1.50352C11.8889 1.4033 11.9286 1.30718 11.9993 1.23631C12.07 1.16544 12.1659 1.12563 12.2659 1.12563C12.3658 1.12563 12.4617 1.16544 12.5324 1.23631C12.6031 1.30718 12.6428 1.4033 12.6428 1.50352V2.99899C12.6428 3.09922 12.6031 3.19534 12.5324 3.2662C12.4617 3.33707 12.3658 3.37688 12.2659 3.37688C12.1659 3.37688 12.07 3.33707 11.9993 3.2662C11.9286 3.19534 11.8889 3.09922 11.8889 2.99899V1.50352ZM3.54807 1.50352C3.54807 1.4033 3.58778 1.30718 3.65847 1.23631C3.72916 1.16544 3.82504 1.12563 3.92501 1.12563C4.02498 1.12563 4.12086 1.16544 4.19155 1.23631C4.26224 1.30718 4.30195 1.4033 4.30195 1.50352V2.99899C4.30195 3.09922 4.26224 3.19534 4.19155 3.2662C4.12086 3.33707 4.02498 3.37688 3.92501 3.37688C3.82504 3.37688 3.72916 3.33707 3.65847 3.2662C3.58778 3.19534 3.54807 3.09922 3.54807 2.99899V1.50352ZM14.8772 14.1717C14.8747 14.3573 14.8001 14.5345 14.6691 14.6658C14.5382 14.797 14.3614 14.8719 14.1762 14.8744H1.82536C1.63995 14.8723 1.4627 14.7976 1.33144 14.6663C1.20018 14.5351 1.12531 14.3575 1.12281 14.1717V6.59296H14.8772V14.1717Z" fill="#327289"/>
|
||||||
|
<path d="M2.33063 11.282H3.93464V12.6006C3.93464 12.7499 3.99379 12.8931 4.09907 12.9986C4.20435 13.1041 4.34715 13.1634 4.49604 13.1634C4.64494 13.1634 4.78773 13.1041 4.89301 12.9986C4.9983 12.8931 5.05745 12.7499 5.05745 12.6006V11.282H7.46346V12.6006C7.46346 12.7499 7.52261 12.8931 7.62789 12.9986C7.73318 13.1041 7.87597 13.1634 8.02486 13.1634C8.17376 13.1634 8.31655 13.1041 8.42184 12.9986C8.52712 12.8931 8.58627 12.7499 8.58627 12.6006V11.282H10.9923V12.6006C10.9923 12.7499 11.0514 12.8931 11.1567 12.9986C11.262 13.1041 11.4048 13.1634 11.5537 13.1634C11.7026 13.1634 11.8454 13.1041 11.9507 12.9986C12.0559 12.8931 12.1151 12.7499 12.1151 12.6006V11.282H13.7191C13.868 11.282 14.0108 11.2227 14.1161 11.1172C14.2214 11.0116 14.2805 10.8685 14.2805 10.7192C14.2805 10.57 14.2214 10.4268 14.1161 10.3213C14.0108 10.2157 13.868 10.1564 13.7191 10.1564H12.1151V8.84425C12.1151 8.69498 12.0559 8.55183 11.9507 8.44628C11.8454 8.34073 11.7026 8.28143 11.5537 8.28143C11.4048 8.28143 11.262 8.34073 11.1567 8.44628C11.0514 8.55183 10.9923 8.69498 10.9923 8.84425V10.1628H8.58627V8.84425C8.58627 8.69498 8.52712 8.55183 8.42184 8.44628C8.31655 8.34073 8.17376 8.28143 8.02486 8.28143C7.87597 8.28143 7.73318 8.34073 7.62789 8.44628C7.52261 8.55183 7.46346 8.69498 7.46346 8.84425V10.1628H5.05745V8.84425C5.05745 8.69498 4.9983 8.55183 4.89301 8.44628C4.78773 8.34073 4.64494 8.28143 4.49604 8.28143C4.34715 8.28143 4.20435 8.34073 4.09907 8.44628C3.99379 8.55183 3.93464 8.69498 3.93464 8.84425V10.1628H2.33063C2.18174 10.1628 2.03894 10.2221 1.93366 10.3277C1.82837 10.4332 1.76923 10.5764 1.76923 10.7257C1.76923 10.8749 1.82837 11.0181 1.93366 11.1236C2.03894 11.2292 2.18174 11.2885 2.33063 11.2885V11.282Z" fill="#327289"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_14504_113611">
|
||||||
|
<rect width="16" height="16" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.8 KiB |
|
|
@ -10,6 +10,7 @@ const applicationConfig = {
|
||||||
PAGE_QUERYSTRING: "fmgPage",
|
PAGE_QUERYSTRING: "fmgPage",
|
||||||
SITE_ENTRY_TRIGGER_VALUE: "FixMyGlass",
|
SITE_ENTRY_TRIGGER_VALUE: "FixMyGlass",
|
||||||
CASH_PARENT_ACCOUNT_NUMBER: 167132,
|
CASH_PARENT_ACCOUNT_NUMBER: 167132,
|
||||||
|
MY_ACCOUNT: process.env.VUE_APP_MY_ACCOUNT,
|
||||||
};
|
};
|
||||||
|
|
||||||
export { applicationConfig };
|
export { applicationConfig };
|
||||||
|
|
|
||||||
|
|
@ -8,3 +8,57 @@ export function getDateDifferenceInDays(startDate, endDate) {
|
||||||
// To calculate the no. of days between two dates
|
// To calculate the no. of days between two dates
|
||||||
return Difference_In_Time / (1000 * 3600 * 24);
|
return Difference_In_Time / (1000 * 3600 * 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getFullDayName(date) {
|
||||||
|
if (date instanceof Date !== true) return;
|
||||||
|
const days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
|
||||||
|
return days[date.getDay()];
|
||||||
|
}
|
||||||
|
export function getFullMonthName(date) {
|
||||||
|
if (date instanceof Date !== true) return;
|
||||||
|
const monthNames = [
|
||||||
|
"January",
|
||||||
|
"February",
|
||||||
|
"March",
|
||||||
|
"April",
|
||||||
|
"May",
|
||||||
|
"June",
|
||||||
|
"July",
|
||||||
|
"August",
|
||||||
|
"September",
|
||||||
|
"October",
|
||||||
|
"November",
|
||||||
|
"December",
|
||||||
|
];
|
||||||
|
return monthNames[date.getMonth()];
|
||||||
|
}
|
||||||
|
export function get12HourTimeFormat(time) {
|
||||||
|
// Check correct time format and split into components
|
||||||
|
time = time.toString().match(/^([01]\d|2[0-3])(:)([0-5]\d)?$/) || [time];
|
||||||
|
|
||||||
|
if (time.length > 1) {
|
||||||
|
// If time format correct
|
||||||
|
time = time.slice(1); // Remove full string match value
|
||||||
|
time[5] = +time[0] < 12 ? " AM" : " PM"; // Set AM/PM
|
||||||
|
time[0] = +time[0] % 12 || 12; // Adjust hours
|
||||||
|
}
|
||||||
|
return time.join(""); // return adjusted time or original string
|
||||||
|
}
|
||||||
|
export function get12HourTimeMobileFormat(time) {
|
||||||
|
// Check correct time format and split into components
|
||||||
|
time = time.toString().match(/^([01]\d|2[0-3])(:)([0-5]\d)?$/) || [time];
|
||||||
|
|
||||||
|
if (time.length > 1) {
|
||||||
|
// If time format correct
|
||||||
|
const min = time[3];
|
||||||
|
time = time.slice(1); // Remove full string match value
|
||||||
|
if (Number(min) == 0) {
|
||||||
|
time = time.slice(0, 1); // Remove minute value
|
||||||
|
time[1] = +time[0] < 12 ? " AM" : " PM"; // Set AM/PM
|
||||||
|
} else {
|
||||||
|
time[5] = +time[0] < 12 ? " AM" : " PM"; // Set AM/PM
|
||||||
|
}
|
||||||
|
time[0] = +time[0] % 12 || 12; // Adjust hours
|
||||||
|
}
|
||||||
|
return time.join(""); // return adjusted time or original string
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import { shallowMount } from "@vue/test-utils";
|
||||||
import { nextTick } from "vue";
|
import { nextTick } from "vue";
|
||||||
import { getMountOptions } from "@/helpers/unit-test-helper.js";
|
import { getMountOptions } from "@/helpers/unit-test-helper.js";
|
||||||
import store from "@/store";
|
import store from "@/store";
|
||||||
|
import router from "@/router";
|
||||||
|
|
||||||
// Mock our module for promises.
|
// Mock our module for promises.
|
||||||
jest.mock("@/helpers/layout-helper.js", () => ({
|
jest.mock("@/helpers/layout-helper.js", () => ({
|
||||||
|
|
@ -54,6 +55,14 @@ beforeEach(() => {
|
||||||
isRepair: false,
|
isRepair: false,
|
||||||
},
|
},
|
||||||
referralNumber: "1234567",
|
referralNumber: "1234567",
|
||||||
|
vehicle: {
|
||||||
|
year: "2004",
|
||||||
|
make: "Ford",
|
||||||
|
model: "F Series F250",
|
||||||
|
},
|
||||||
|
customer: {
|
||||||
|
emailAddress: "test@test.com",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
payment: {
|
payment: {
|
||||||
isInsurance: true,
|
isInsurance: true,
|
||||||
|
|
@ -71,9 +80,19 @@ afterEach(() => {
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("confirmation.vue", () => {
|
describe("confirmation.vue", () => {
|
||||||
|
const realLocation = window.location;
|
||||||
|
|
||||||
|
beforeAll(() => {
|
||||||
|
delete window.location;
|
||||||
|
window.location = { ...realLocation, assign: jest.fn() };
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(() => {
|
||||||
|
window.location = realLocation;
|
||||||
|
});
|
||||||
test("arePagePrerequisitesValid should be true ", async () => {
|
test("arePagePrerequisitesValid should be true ", async () => {
|
||||||
//Arrange
|
//Arrange
|
||||||
const { wrapper } = setupMocks();
|
const { wrapper } = setupMocks({});
|
||||||
|
|
||||||
//Act
|
//Act
|
||||||
let arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid();
|
let arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid();
|
||||||
|
|
@ -82,20 +101,33 @@ describe("confirmation.vue", () => {
|
||||||
//Assert
|
//Assert
|
||||||
expect(arePagePrerequisitesValid).toBe(true);
|
expect(arePagePrerequisitesValid).toBe(true);
|
||||||
});
|
});
|
||||||
|
test("'Back to safelite.com' button should take user back to safelite.com", async () => {
|
||||||
|
//Arrange
|
||||||
|
const { wrapper } = setupMocks({});
|
||||||
|
|
||||||
|
//Act
|
||||||
|
await wrapper.vm.forwardButtonAction();
|
||||||
|
|
||||||
|
//Assert
|
||||||
|
expect(window.location.assign).toHaveBeenCalled();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
function setupMocks() {
|
const wordingText = "wording Text";
|
||||||
const wrapper = shallowMount(
|
function setupMocks({ customMountOptions }) {
|
||||||
confirmation,
|
const mountOptions = getMountOptions({
|
||||||
getMountOptions({
|
...customMountOptions,
|
||||||
router: {
|
});
|
||||||
navigate: jest.fn(),
|
|
||||||
navigate: jest.fn(),
|
|
||||||
navigateWithSaving: jest.fn(),
|
|
||||||
navigateWithoutSaving: jest.fn(),
|
|
||||||
},
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
|
mountOptions.mixins = [
|
||||||
|
{
|
||||||
|
methods: {
|
||||||
|
getCmsContent: jest.fn().mockImplementation(() => {
|
||||||
|
return wordingText;
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const wrapper = shallowMount(confirmation, mountOptions);
|
||||||
return { wrapper };
|
return { wrapper };
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,40 @@
|
||||||
<div class="container-fluid pb-2">
|
<div class="container-fluid pb-2">
|
||||||
<div class="row justify-content-md-center">
|
<div class="row justify-content-md-center">
|
||||||
<div class="col-md-6 col-xl-4">
|
<div class="col-md-6 col-xl-4">
|
||||||
|
<div class="header-container">
|
||||||
|
<img :src="ScheduleConfirmationImage" />
|
||||||
|
<span v-html="ScheduleConfirmationText"></span>
|
||||||
|
</div>
|
||||||
|
<div class="main">
|
||||||
|
<div>
|
||||||
|
<vehicleBanner
|
||||||
|
cmsWidgetName="VehicleBannerWidget"
|
||||||
|
:displayGenericVehicleImage="false" />
|
||||||
|
</div>
|
||||||
|
<div class="scheduleText">
|
||||||
|
<p>{{ this.getScheduleDate() }}</p>
|
||||||
|
<p>{{ this.getScheduleTime() }}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="calendar-section">
|
||||||
|
<div class="add-to-calendar">
|
||||||
|
<button>
|
||||||
|
<span class="add-to-calendar-span">
|
||||||
|
<img
|
||||||
|
src="~@/assets/img/icons/add-to-calendar.svg"
|
||||||
|
class="add-to-calendar-img" />
|
||||||
|
<span class="add-to-calendar-text"
|
||||||
|
>Add to calendar</span
|
||||||
|
></span
|
||||||
|
>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="appoinmenttext"
|
||||||
|
v-html="this.getAppointmentWordingText()"></div>
|
||||||
|
</div>
|
||||||
|
<div class="emailtext" v-html="this.getConfirmationEmailText()"></div>
|
||||||
<navbar
|
<navbar
|
||||||
cmsWidgetName="FunnelFooterWidget"
|
cmsWidgetName="FunnelFooterWidget"
|
||||||
ref="navbar"
|
ref="navbar"
|
||||||
|
|
@ -21,12 +55,21 @@
|
||||||
<script>
|
<script>
|
||||||
// Components
|
// Components
|
||||||
import funnelHeader from "@/fmg-components/funnel-header/funnel-header";
|
import funnelHeader from "@/fmg-components/funnel-header/funnel-header";
|
||||||
|
import vehicleBanner from "@/fmg-components/vehicle-banner/vehicle-banner";
|
||||||
import navbar from "@/fmg-components/nav-bar/nav-bar";
|
import navbar from "@/fmg-components/nav-bar/nav-bar";
|
||||||
//Supporting files
|
//Supporting files
|
||||||
import { fetchCmsContentForPage } from "@/helpers/cms-content-helper";
|
import { fetchCmsContentForPage } from "@/helpers/cms-content-helper";
|
||||||
import { AppointmentTypeStrings } from "@/constants/schedule-constants";
|
import { AppointmentTypeStrings } from "@/constants/schedule-constants";
|
||||||
import { settleAllPromises } from "@/helpers/layout-helper";
|
import { settleAllPromises } from "@/helpers/layout-helper";
|
||||||
|
import { applicationConfig } from "@/constants/application-config.js";
|
||||||
import store from "@/store";
|
import store from "@/store";
|
||||||
|
|
||||||
|
import {
|
||||||
|
getFullDayName,
|
||||||
|
getFullMonthName,
|
||||||
|
get12HourTimeFormat,
|
||||||
|
get12HourTimeMobileFormat,
|
||||||
|
} from "@/helpers/date-helper";
|
||||||
export default {
|
export default {
|
||||||
name: "confirmation",
|
name: "confirmation",
|
||||||
async beforeRouteEnter(to, from, next) {
|
async beforeRouteEnter(to, from, next) {
|
||||||
|
|
@ -47,6 +90,77 @@ export default {
|
||||||
vm.setCmsContent(resultMap.cmsContent);
|
vm.setCmsContent(resultMap.cmsContent);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
ScheduleConfirmationText() {
|
||||||
|
return this.getCmsContent("ScheduleConfirmationWidget", "BodyText");
|
||||||
|
},
|
||||||
|
ScheduleConfirmationImage() {
|
||||||
|
return this.getCmsContent("ScheduleConfirmationWidget", "Image");
|
||||||
|
},
|
||||||
|
ConfirmationEmailText() {
|
||||||
|
return this.getCmsContent("ConfirmationEmailWidget", "BodyText");
|
||||||
|
},
|
||||||
|
ScheduleDate() {
|
||||||
|
return store.getters.order.schedule.date;
|
||||||
|
},
|
||||||
|
AppointmentType() {
|
||||||
|
return store.getters.order.serviceLocation.appointmentType;
|
||||||
|
},
|
||||||
|
ScheduleStartTime() {
|
||||||
|
return store.getters.order.schedule.startTime;
|
||||||
|
},
|
||||||
|
ScheduleEndTime() {
|
||||||
|
return store.getters.order.schedule.endTime;
|
||||||
|
},
|
||||||
|
InShopWordingText() {
|
||||||
|
return this.getCmsContent("InShopWordingWidget", "BodyText");
|
||||||
|
},
|
||||||
|
MobileWordingText() {
|
||||||
|
return this.getCmsContent("MobileWordingWidget", "BodyText");
|
||||||
|
},
|
||||||
|
DropOffWordingText() {
|
||||||
|
return this.getCmsContent("DropOffWordingWidget", "BodyText");
|
||||||
|
},
|
||||||
|
ServiceLocationAddress() {
|
||||||
|
return store.getters.order.serviceLocation.address;
|
||||||
|
},
|
||||||
|
ServiceLocationAddress2() {
|
||||||
|
return store.getters.order.serviceLocation.address2;
|
||||||
|
},
|
||||||
|
ServiceLocationCity() {
|
||||||
|
return store.getters.order.serviceLocation.city;
|
||||||
|
},
|
||||||
|
ServiceLocationState() {
|
||||||
|
return store.getters.order.serviceLocation.state;
|
||||||
|
},
|
||||||
|
ServiceLocationZipCode() {
|
||||||
|
return store.getters.order.serviceLocation.zipCode;
|
||||||
|
},
|
||||||
|
ProviderAddress() {
|
||||||
|
return store.getters.order.serviceLocation.provider.address.streetAddress;
|
||||||
|
},
|
||||||
|
ProviderCity() {
|
||||||
|
return store.getters.order.serviceLocation.provider.address.city;
|
||||||
|
},
|
||||||
|
ProviderState() {
|
||||||
|
return store.getters.order.serviceLocation.provider.address.state;
|
||||||
|
},
|
||||||
|
ProviderZipCode() {
|
||||||
|
return store.getters.order.serviceLocation.provider.address.zipCode;
|
||||||
|
},
|
||||||
|
Year() {
|
||||||
|
return store.getters.order.vehicle.year;
|
||||||
|
},
|
||||||
|
Make() {
|
||||||
|
return store.getters.order.vehicle.make;
|
||||||
|
},
|
||||||
|
Model() {
|
||||||
|
return store.getters.order.vehicle.model;
|
||||||
|
},
|
||||||
|
Email() {
|
||||||
|
return store.getters.order.customer.emailAddress;
|
||||||
|
},
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
workOrderNumber: store.getters.order.workOrderNumber,
|
workOrderNumber: store.getters.order.workOrderNumber,
|
||||||
|
|
@ -83,12 +197,136 @@ export default {
|
||||||
return serviceLocationReqs && scheduleReqs;
|
return serviceLocationReqs && scheduleReqs;
|
||||||
},
|
},
|
||||||
forwardButtonAction() {
|
forwardButtonAction() {
|
||||||
window.location.replace("https://safelite.com");
|
window.location.assign("//www.safelite.com/");
|
||||||
|
},
|
||||||
|
getScheduleDate() {
|
||||||
|
const scheduleDate = new Date(this.ScheduleDate);
|
||||||
|
return `${getFullDayName(scheduleDate)}, ${getFullMonthName(
|
||||||
|
scheduleDate
|
||||||
|
)} ${scheduleDate.getDate()}`;
|
||||||
|
},
|
||||||
|
getScheduleTime() {
|
||||||
|
if (this.AppointmentType == AppointmentTypeStrings.MOBILE) {
|
||||||
|
return `Between ${get12HourTimeMobileFormat(
|
||||||
|
this.ScheduleStartTime
|
||||||
|
)} - ${get12HourTimeMobileFormat(this.ScheduleEndTime)}`;
|
||||||
|
} else if (this.AppointmentType == AppointmentTypeStrings.DROP_OFF) {
|
||||||
|
return `Drop off before 9:30 AM`;
|
||||||
|
} else {
|
||||||
|
return `at ${get12HourTimeFormat(this.ScheduleStartTime)}`;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
getAppointmentWordingText() {
|
||||||
|
const ymm = `${this.Year} ${this.Make} ${this.Model}`;
|
||||||
|
if (this.AppointmentType == AppointmentTypeStrings.MOBILE) {
|
||||||
|
const address = `${
|
||||||
|
this.ServiceLocationAddress2 ? this.ServiceLocationAddress2 + "," : ""
|
||||||
|
} ${this.ServiceLocationAddress},<br/> ${this.ServiceLocationCity}, ${
|
||||||
|
this.ServiceLocationState
|
||||||
|
} ${this.ServiceLocationZipCode}`;
|
||||||
|
return this.MobileWordingText.replace("#ADDRESS", address).replace("#YMM", ymm);
|
||||||
|
} else if (this.AppointmentType == AppointmentTypeStrings.DROP_OFF) {
|
||||||
|
const address = `${this.ProviderAddress},<br/> ${this.ProviderCity}, ${this.ProviderState} ${this.ProviderZipCode}`;
|
||||||
|
return this.DropOffWordingText.replace("#ADDRESS", address).replace("#YMM", ymm);
|
||||||
|
} else {
|
||||||
|
const address = `${this.ProviderAddress},<br/> ${this.ProviderCity}, ${this.ProviderState} ${this.ProviderZipCode}`;
|
||||||
|
return this.InShopWordingText.replace("#ADDRESS", address).replace("#YMM", ymm);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getConfirmationEmailText() {
|
||||||
|
return this.ConfirmationEmailText.replace("#EMAIL", this.Email)
|
||||||
|
.replace("#MY_ACCOUNT_URL", applicationConfig.MY_ACCOUNT)
|
||||||
|
.replace(/</g, "<")
|
||||||
|
.replace(/>/g, ">");
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
funnelHeader,
|
funnelHeader,
|
||||||
navbar,
|
navbar,
|
||||||
|
vehicleBanner,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.main {
|
||||||
|
padding: 1rem 0;
|
||||||
|
box-shadow: 0 3px 10px rgb(0 0 0 / 0.2);
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
.scheduleText {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scheduleText P {
|
||||||
|
margin: 0;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 1.25rem;
|
||||||
|
color: $black;
|
||||||
|
|
||||||
|
+ p {
|
||||||
|
font-size: 1rem;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.calendar-section[data-v-8004c52c] {
|
||||||
|
display: table;
|
||||||
|
position: relative;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-section .add-to-calendar {
|
||||||
|
padding: 10px 0;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.add-to-calendar button {
|
||||||
|
border: 0;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-section .add-to-calendar .add-to-calendar-span {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.calendar-section .add-to-calendar .add-to-calendar-img {
|
||||||
|
display: inline;
|
||||||
|
width: 20px;
|
||||||
|
}
|
||||||
|
.add-to-calendar-text {
|
||||||
|
margin: 0 0 0 7px;
|
||||||
|
color: #1574a1;
|
||||||
|
vertical-align: middle;
|
||||||
|
font-weight: 500;
|
||||||
|
font-family: "Roboto";
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
.header-container {
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
p {
|
||||||
|
display: inline-block;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 1.25rem;
|
||||||
|
padding: 0.3rem;
|
||||||
|
color: $black;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.appoinmenttext strong {
|
||||||
|
color: $black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.emailtext {
|
||||||
|
padding: 1.5rem 0 0;
|
||||||
|
|
||||||
|
p {
|
||||||
|
font-size: 0.875rem;
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
strong {
|
||||||
|
color: $black;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,8 @@
|
||||||
process.env.VUE_APP_CONSUMER_CF_DISTRO =
|
process.env.VUE_APP_CONSUMER_CF_DISTRO = "https://digitalapi.dev.safelite.io";
|
||||||
"https://digitalapi.dev.safelite.io";
|
process.env.VUE_APP_HERITAGE_FUNNEL = "http://localhost:38000/default.aspx";
|
||||||
process.env.VUE_APP_HERITAGE_FUNNEL =
|
process.env.VUE_APP_GOOGLE_PLACES_API_KEY = "AIzaSyDptGCkOPgN2uWJOy4ou4M33phRD4MAoJo";
|
||||||
"http://localhost:38000/default.aspx";
|
|
||||||
process.env.VUE_APP_GOOGLE_PLACES_API_KEY =
|
|
||||||
"AIzaSyDptGCkOPgN2uWJOy4ou4M33phRD4MAoJo";
|
|
||||||
process.env.VUE_APP_CURRENT_ENVIRONMENT = "Localhost";
|
process.env.VUE_APP_CURRENT_ENVIRONMENT = "Localhost";
|
||||||
|
process.env.VUE_APP_MY_ACCOUNT = "https://myaccountdev.safelite.com/";
|
||||||
|
|
||||||
//process.env.VUE_APP_SAFELITE_HOP = "http://localhost:60966/fmgCheckoutEmbedded.aspx";
|
//process.env.VUE_APP_SAFELITE_HOP = "http://localhost:60966/fmgCheckoutEmbedded.aspx";
|
||||||
process.env.VUE_APP_SAFELITE_HOP = "https://sv2-safelitehop-sys.safelite.com/fmgCheckoutEmbedded.aspx";
|
process.env.VUE_APP_SAFELITE_HOP = "https://sv2-safelitehop-sys.safelite.com/fmgCheckoutEmbedded.aspx";
|
||||||
|
|
@ -12,30 +10,31 @@ process.env.VUE_APP_PAYPAL_SUCCESS_URL = "http://localhost:8080/fmg/?fmgPage=pay
|
||||||
process.env.VUE_APP_PAYPAL_CANCEL_URL = "http://localhost:8080/fmg/?fmgPage=payment-method&src=concept-funnel";
|
process.env.VUE_APP_PAYPAL_CANCEL_URL = "http://localhost:8080/fmg/?fmgPage=payment-method&src=concept-funnel";
|
||||||
|
|
||||||
// GA & GTM
|
// GA & GTM
|
||||||
process.env.VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY = "(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl+ '>m_auth=amlAYNhxUxuskQo7jmjadg>m_preview=env-38>m_cookies_win=x';f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-M6XCRH');";
|
process.env.VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY =
|
||||||
|
"(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl+ '>m_auth=amlAYNhxUxuskQo7jmjadg>m_preview=env-38>m_cookies_win=x';f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-M6XCRH');";
|
||||||
process.env.VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC = "https://www.googletagmanager.com/ns.html?id=GTM-M6XCRH>m_auth=amlAYNhxUxuskQo7jmjadg>m_preview=env-38>m_cookies_win=x";
|
|
||||||
|
|
||||||
|
process.env.VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC =
|
||||||
|
"https://www.googletagmanager.com/ns.html?id=GTM-M6XCRH>m_auth=amlAYNhxUxuskQo7jmjadg>m_preview=env-38>m_cookies_win=x";
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
outputDir: "dist/fmg",
|
outputDir: "dist/fmg",
|
||||||
publicPath: "/fmg",
|
publicPath: "/fmg",
|
||||||
css: {
|
css: {
|
||||||
loaderOptions: {
|
loaderOptions: {
|
||||||
sass: {
|
sass: {
|
||||||
// Load Order Matters!!!
|
// Load Order Matters!!!
|
||||||
// Note: only include functions, variables and mixins here
|
// Note: only include functions, variables and mixins here
|
||||||
prependData: `
|
prependData: `
|
||||||
@import "./node_modules/bootstrap/scss/functions";
|
@import "./node_modules/bootstrap/scss/functions";
|
||||||
@import "@/styles/ux-variables.scss";
|
@import "@/styles/ux-variables.scss";
|
||||||
@import "./node_modules/bootstrap/scss/variables";
|
@import "./node_modules/bootstrap/scss/variables";
|
||||||
@import "./node_modules/bootstrap/scss/mixins";
|
@import "./node_modules/bootstrap/scss/mixins";
|
||||||
@import "@/styles/mixins/customMixins";
|
@import "@/styles/mixins/customMixins";
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
configureWebpack: {
|
||||||
|
devtool: "source-map",
|
||||||
},
|
},
|
||||||
},
|
|
||||||
configureWebpack: {
|
|
||||||
devtool: 'source-map'
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ process.env.VUE_APP_CONSUMER_CF_DISTRO = "__VUE_APP_CONSUMER_CF_DISTRO__";
|
||||||
process.env.VUE_APP_GOOGLE_PLACES_API_KEY = "__VUE_APP_GOOGLE_PLACES_API_KEY__";
|
process.env.VUE_APP_GOOGLE_PLACES_API_KEY = "__VUE_APP_GOOGLE_PLACES_API_KEY__";
|
||||||
process.env.VUE_APP_HERITAGE_FUNNEL = "__VUE_APP_HERITAGE_FUNNEL__";
|
process.env.VUE_APP_HERITAGE_FUNNEL = "__VUE_APP_HERITAGE_FUNNEL__";
|
||||||
process.env.VUE_APP_CURRENT_ENVIRONMENT = "__VUE_APP_CURRENT_ENVIRONMENT__";
|
process.env.VUE_APP_CURRENT_ENVIRONMENT = "__VUE_APP_CURRENT_ENVIRONMENT__";
|
||||||
|
process.env.VUE_APP_MY_ACCOUNT = "__VUE_APP_MY_ACCOUNT__";
|
||||||
|
|
||||||
process.env.VUE_APP_SAFELITE_HOP = "__VUE_APP_SAFELITE_HOP__";
|
process.env.VUE_APP_SAFELITE_HOP = "__VUE_APP_SAFELITE_HOP__";
|
||||||
process.env.VUE_APP_PAYPAL_SUCCESS_URL = "__VUE_APP_PAYPAL_SUCCESS_URL__";
|
process.env.VUE_APP_PAYPAL_SUCCESS_URL = "__VUE_APP_PAYPAL_SUCCESS_URL__";
|
||||||
|
|
@ -9,24 +10,25 @@ process.env.VUE_APP_PAYPAL_CANCEL_URL = "__VUE_APP_PAYPAL_CANCEL_URL__";
|
||||||
|
|
||||||
// GA & GTM
|
// GA & GTM
|
||||||
process.env.VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY = "__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__";
|
process.env.VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY = "__VUE_APP_GOOGLE_TAG_MANAGER_SCRIPT_BODY__";
|
||||||
process.env.VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC = "__VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC__"
|
process.env.VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC =
|
||||||
|
"__VUE_APP_GOOGLE_TAG_MANAGER_NOSCRIPT_FRAME_SRC__";
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
outputDir: "dist/fmg",
|
outputDir: "dist/fmg",
|
||||||
publicPath: "/fmg",
|
publicPath: "/fmg",
|
||||||
css: {
|
css: {
|
||||||
loaderOptions: {
|
loaderOptions: {
|
||||||
sass: {
|
sass: {
|
||||||
// Load Order Matters!!!
|
// Load Order Matters!!!
|
||||||
// Note: only include functions, variables and mixins here
|
// Note: only include functions, variables and mixins here
|
||||||
prependData: `
|
prependData: `
|
||||||
@import "./node_modules/bootstrap/scss/functions";
|
@import "./node_modules/bootstrap/scss/functions";
|
||||||
@import "@/styles/ux-variables.scss";
|
@import "@/styles/ux-variables.scss";
|
||||||
@import "./node_modules/bootstrap/scss/variables";
|
@import "./node_modules/bootstrap/scss/variables";
|
||||||
@import "./node_modules/bootstrap/scss/mixins";
|
@import "./node_modules/bootstrap/scss/mixins";
|
||||||
@import "@/styles/mixins/customMixins";
|
@import "@/styles/mixins/customMixins";
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue