Merge branch 'develop' into feature/INSR-8130
This commit is contained in:
commit
291cc89897
40 changed files with 1267 additions and 820 deletions
534
package-lock.json
generated
534
package-lock.json
generated
|
|
@ -63,7 +63,7 @@
|
||||||
"typescript-eslint": "^8.11.0",
|
"typescript-eslint": "^8.11.0",
|
||||||
"vite": "^6.4.1",
|
"vite": "^6.4.1",
|
||||||
"vitest": "^3.2.4",
|
"vitest": "^3.2.4",
|
||||||
"volar-service-vetur": "latest",
|
"volar-service-vetur": "*",
|
||||||
"wait-on": "^8.0.2"
|
"wait-on": "^8.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -4419,6 +4419,28 @@
|
||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/eslint": {
|
||||||
|
"version": "9.6.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
|
||||||
|
"integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/estree": "*",
|
||||||
|
"@types/json-schema": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@types/eslint-scope": {
|
||||||
|
"version": "3.7.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
|
||||||
|
"integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/eslint": "*",
|
||||||
|
"@types/estree": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@types/estree": {
|
"node_modules/@types/estree": {
|
||||||
"version": "1.0.8",
|
"version": "1.0.8",
|
||||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
|
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
|
||||||
|
|
@ -5999,148 +6021,163 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@webassemblyjs/ast": {
|
"node_modules/@webassemblyjs/ast": {
|
||||||
"version": "1.12.1",
|
"version": "1.14.1",
|
||||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz",
|
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
|
||||||
"integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==",
|
"integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@webassemblyjs/helper-numbers": "1.11.6",
|
"@webassemblyjs/helper-numbers": "1.13.2",
|
||||||
"@webassemblyjs/helper-wasm-bytecode": "1.11.6"
|
"@webassemblyjs/helper-wasm-bytecode": "1.13.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@webassemblyjs/floating-point-hex-parser": {
|
"node_modules/@webassemblyjs/floating-point-hex-parser": {
|
||||||
"version": "1.11.6",
|
"version": "1.13.2",
|
||||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
|
"resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
|
||||||
"integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
|
"integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@webassemblyjs/helper-api-error": {
|
"node_modules/@webassemblyjs/helper-api-error": {
|
||||||
"version": "1.11.6",
|
"version": "1.13.2",
|
||||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
|
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
|
||||||
"integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
|
"integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@webassemblyjs/helper-buffer": {
|
"node_modules/@webassemblyjs/helper-buffer": {
|
||||||
"version": "1.12.1",
|
"version": "1.14.1",
|
||||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz",
|
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
|
||||||
"integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==",
|
"integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@webassemblyjs/helper-numbers": {
|
"node_modules/@webassemblyjs/helper-numbers": {
|
||||||
"version": "1.11.6",
|
"version": "1.13.2",
|
||||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
|
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
|
||||||
"integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
|
"integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@webassemblyjs/floating-point-hex-parser": "1.11.6",
|
"@webassemblyjs/floating-point-hex-parser": "1.13.2",
|
||||||
"@webassemblyjs/helper-api-error": "1.11.6",
|
"@webassemblyjs/helper-api-error": "1.13.2",
|
||||||
"@xtuc/long": "4.2.2"
|
"@xtuc/long": "4.2.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@webassemblyjs/helper-wasm-bytecode": {
|
"node_modules/@webassemblyjs/helper-wasm-bytecode": {
|
||||||
"version": "1.11.6",
|
"version": "1.13.2",
|
||||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
|
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
|
||||||
"integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
|
"integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@webassemblyjs/helper-wasm-section": {
|
"node_modules/@webassemblyjs/helper-wasm-section": {
|
||||||
"version": "1.12.1",
|
"version": "1.14.1",
|
||||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz",
|
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
|
||||||
"integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==",
|
"integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@webassemblyjs/ast": "1.12.1",
|
"@webassemblyjs/ast": "1.14.1",
|
||||||
"@webassemblyjs/helper-buffer": "1.12.1",
|
"@webassemblyjs/helper-buffer": "1.14.1",
|
||||||
"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
|
"@webassemblyjs/helper-wasm-bytecode": "1.13.2",
|
||||||
"@webassemblyjs/wasm-gen": "1.12.1"
|
"@webassemblyjs/wasm-gen": "1.14.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@webassemblyjs/ieee754": {
|
"node_modules/@webassemblyjs/ieee754": {
|
||||||
"version": "1.11.6",
|
"version": "1.13.2",
|
||||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
|
"resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
|
||||||
"integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
|
"integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@xtuc/ieee754": "^1.2.0"
|
"@xtuc/ieee754": "^1.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@webassemblyjs/leb128": {
|
"node_modules/@webassemblyjs/leb128": {
|
||||||
"version": "1.11.6",
|
"version": "1.13.2",
|
||||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
|
"resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
|
||||||
"integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
|
"integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@xtuc/long": "4.2.2"
|
"@xtuc/long": "4.2.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@webassemblyjs/utf8": {
|
"node_modules/@webassemblyjs/utf8": {
|
||||||
"version": "1.11.6",
|
"version": "1.13.2",
|
||||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
|
"resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
|
||||||
"integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
|
"integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@webassemblyjs/wasm-edit": {
|
"node_modules/@webassemblyjs/wasm-edit": {
|
||||||
"version": "1.12.1",
|
"version": "1.14.1",
|
||||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz",
|
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
|
||||||
"integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==",
|
"integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@webassemblyjs/ast": "1.12.1",
|
"@webassemblyjs/ast": "1.14.1",
|
||||||
"@webassemblyjs/helper-buffer": "1.12.1",
|
"@webassemblyjs/helper-buffer": "1.14.1",
|
||||||
"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
|
"@webassemblyjs/helper-wasm-bytecode": "1.13.2",
|
||||||
"@webassemblyjs/helper-wasm-section": "1.12.1",
|
"@webassemblyjs/helper-wasm-section": "1.14.1",
|
||||||
"@webassemblyjs/wasm-gen": "1.12.1",
|
"@webassemblyjs/wasm-gen": "1.14.1",
|
||||||
"@webassemblyjs/wasm-opt": "1.12.1",
|
"@webassemblyjs/wasm-opt": "1.14.1",
|
||||||
"@webassemblyjs/wasm-parser": "1.12.1",
|
"@webassemblyjs/wasm-parser": "1.14.1",
|
||||||
"@webassemblyjs/wast-printer": "1.12.1"
|
"@webassemblyjs/wast-printer": "1.14.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@webassemblyjs/wasm-gen": {
|
"node_modules/@webassemblyjs/wasm-gen": {
|
||||||
"version": "1.12.1",
|
"version": "1.14.1",
|
||||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz",
|
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
|
||||||
"integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==",
|
"integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@webassemblyjs/ast": "1.12.1",
|
"@webassemblyjs/ast": "1.14.1",
|
||||||
"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
|
"@webassemblyjs/helper-wasm-bytecode": "1.13.2",
|
||||||
"@webassemblyjs/ieee754": "1.11.6",
|
"@webassemblyjs/ieee754": "1.13.2",
|
||||||
"@webassemblyjs/leb128": "1.11.6",
|
"@webassemblyjs/leb128": "1.13.2",
|
||||||
"@webassemblyjs/utf8": "1.11.6"
|
"@webassemblyjs/utf8": "1.13.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@webassemblyjs/wasm-opt": {
|
"node_modules/@webassemblyjs/wasm-opt": {
|
||||||
"version": "1.12.1",
|
"version": "1.14.1",
|
||||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz",
|
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
|
||||||
"integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==",
|
"integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@webassemblyjs/ast": "1.12.1",
|
"@webassemblyjs/ast": "1.14.1",
|
||||||
"@webassemblyjs/helper-buffer": "1.12.1",
|
"@webassemblyjs/helper-buffer": "1.14.1",
|
||||||
"@webassemblyjs/wasm-gen": "1.12.1",
|
"@webassemblyjs/wasm-gen": "1.14.1",
|
||||||
"@webassemblyjs/wasm-parser": "1.12.1"
|
"@webassemblyjs/wasm-parser": "1.14.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@webassemblyjs/wasm-parser": {
|
"node_modules/@webassemblyjs/wasm-parser": {
|
||||||
"version": "1.12.1",
|
"version": "1.14.1",
|
||||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz",
|
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
|
||||||
"integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==",
|
"integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@webassemblyjs/ast": "1.12.1",
|
"@webassemblyjs/ast": "1.14.1",
|
||||||
"@webassemblyjs/helper-api-error": "1.11.6",
|
"@webassemblyjs/helper-api-error": "1.13.2",
|
||||||
"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
|
"@webassemblyjs/helper-wasm-bytecode": "1.13.2",
|
||||||
"@webassemblyjs/ieee754": "1.11.6",
|
"@webassemblyjs/ieee754": "1.13.2",
|
||||||
"@webassemblyjs/leb128": "1.11.6",
|
"@webassemblyjs/leb128": "1.13.2",
|
||||||
"@webassemblyjs/utf8": "1.11.6"
|
"@webassemblyjs/utf8": "1.13.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@webassemblyjs/wast-printer": {
|
"node_modules/@webassemblyjs/wast-printer": {
|
||||||
"version": "1.12.1",
|
"version": "1.14.1",
|
||||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz",
|
"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
|
||||||
"integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==",
|
"integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@webassemblyjs/ast": "1.12.1",
|
"@webassemblyjs/ast": "1.14.1",
|
||||||
"@xtuc/long": "4.2.2"
|
"@xtuc/long": "4.2.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -6148,13 +6185,15 @@
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
|
||||||
"integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
|
"integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"license": "BSD-3-Clause"
|
||||||
},
|
},
|
||||||
"node_modules/@xtuc/long": {
|
"node_modules/@xtuc/long": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
|
||||||
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
|
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"license": "Apache-2.0"
|
||||||
},
|
},
|
||||||
"node_modules/abab": {
|
"node_modules/abab": {
|
||||||
"version": "2.0.6",
|
"version": "2.0.6",
|
||||||
|
|
@ -6225,13 +6264,17 @@
|
||||||
"node": ">=0.4.0"
|
"node": ">=0.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/acorn-import-attributes": {
|
"node_modules/acorn-import-phases": {
|
||||||
"version": "1.9.5",
|
"version": "1.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
|
"resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz",
|
||||||
"integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
|
"integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10.13.0"
|
||||||
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"acorn": "^8"
|
"acorn": "^8.14.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/acorn-jsx": {
|
"node_modules/acorn-jsx": {
|
||||||
|
|
@ -6999,6 +7042,16 @@
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"node_modules/baseline-browser-mapping": {
|
||||||
|
"version": "2.9.19",
|
||||||
|
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz",
|
||||||
|
"integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"bin": {
|
||||||
|
"baseline-browser-mapping": "dist/cli.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/batch": {
|
"node_modules/batch": {
|
||||||
"version": "0.6.1",
|
"version": "0.6.1",
|
||||||
"resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
|
||||||
|
|
@ -7156,9 +7209,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/browserslist": {
|
"node_modules/browserslist": {
|
||||||
"version": "4.23.3",
|
"version": "4.28.1",
|
||||||
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz",
|
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
|
||||||
"integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==",
|
"integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -7174,11 +7227,13 @@
|
||||||
"url": "https://github.com/sponsors/ai"
|
"url": "https://github.com/sponsors/ai"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"caniuse-lite": "^1.0.30001646",
|
"baseline-browser-mapping": "^2.9.0",
|
||||||
"electron-to-chromium": "^1.5.4",
|
"caniuse-lite": "^1.0.30001759",
|
||||||
"node-releases": "^2.0.18",
|
"electron-to-chromium": "^1.5.263",
|
||||||
"update-browserslist-db": "^1.1.0"
|
"node-releases": "^2.0.27",
|
||||||
|
"update-browserslist-db": "^1.2.0"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"browserslist": "cli.js"
|
"browserslist": "cli.js"
|
||||||
|
|
@ -7393,9 +7448,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001653",
|
"version": "1.0.30001768",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001768.tgz",
|
||||||
"integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==",
|
"integrity": "sha512-qY3aDRZC5nWPgHUgIB84WL+nySuo19wk0VJpp/XI9T34lrvkyhRvNVOFJOp2kxClQhiFBu+TaUSudf6oa3vkSA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -7410,7 +7465,8 @@
|
||||||
"type": "github",
|
"type": "github",
|
||||||
"url": "https://github.com/sponsors/ai"
|
"url": "https://github.com/sponsors/ai"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"license": "CC-BY-4.0"
|
||||||
},
|
},
|
||||||
"node_modules/case-sensitive-paths-webpack-plugin": {
|
"node_modules/case-sensitive-paths-webpack-plugin": {
|
||||||
"version": "2.4.0",
|
"version": "2.4.0",
|
||||||
|
|
@ -9295,10 +9351,11 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.5.13",
|
"version": "1.5.286",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz",
|
||||||
"integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==",
|
"integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
"node_modules/emittery": {
|
"node_modules/emittery": {
|
||||||
"version": "0.8.1",
|
"version": "0.8.1",
|
||||||
|
|
@ -9373,13 +9430,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/enhanced-resolve": {
|
"node_modules/enhanced-resolve": {
|
||||||
"version": "5.17.1",
|
"version": "5.19.0",
|
||||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
|
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz",
|
||||||
"integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
|
"integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"graceful-fs": "^4.2.4",
|
"graceful-fs": "^4.2.4",
|
||||||
"tapable": "^2.2.0"
|
"tapable": "^2.3.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10.13.0"
|
"node": ">=10.13.0"
|
||||||
|
|
@ -9556,10 +9614,11 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/escalade": {
|
"node_modules/escalade": {
|
||||||
"version": "3.1.2",
|
"version": "3.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
|
||||||
"integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
|
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
|
|
@ -10355,6 +10414,23 @@
|
||||||
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
|
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/fast-uri": {
|
||||||
|
"version": "3.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
|
||||||
|
"integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
|
||||||
|
"dev": true,
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/fastify"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/fastify"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "BSD-3-Clause"
|
||||||
|
},
|
||||||
"node_modules/fastq": {
|
"node_modules/fastq": {
|
||||||
"version": "1.13.0",
|
"version": "1.13.0",
|
||||||
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
|
||||||
|
|
@ -10904,7 +10980,8 @@
|
||||||
"version": "0.4.1",
|
"version": "0.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
|
||||||
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
|
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"license": "BSD-2-Clause"
|
||||||
},
|
},
|
||||||
"node_modules/globals": {
|
"node_modules/globals": {
|
||||||
"version": "11.12.0",
|
"version": "11.12.0",
|
||||||
|
|
@ -15186,12 +15263,17 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/loader-runner": {
|
"node_modules/loader-runner": {
|
||||||
"version": "4.3.0",
|
"version": "4.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz",
|
||||||
"integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
|
"integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.11.5"
|
"node": ">=6.11.5"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/webpack"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/loader-utils": {
|
"node_modules/loader-utils": {
|
||||||
|
|
@ -16372,10 +16454,11 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/node-releases": {
|
"node_modules/node-releases": {
|
||||||
"version": "2.0.18",
|
"version": "2.0.27",
|
||||||
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
|
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
|
||||||
"integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
|
"integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/nopt": {
|
"node_modules/nopt": {
|
||||||
"version": "6.0.0",
|
"version": "6.0.0",
|
||||||
|
|
@ -19604,12 +19687,17 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/tapable": {
|
"node_modules/tapable": {
|
||||||
"version": "2.2.1",
|
"version": "2.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
|
||||||
"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
|
"integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/webpack"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/tar": {
|
"node_modules/tar": {
|
||||||
|
|
@ -19743,16 +19831,17 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/terser-webpack-plugin": {
|
"node_modules/terser-webpack-plugin": {
|
||||||
"version": "5.3.10",
|
"version": "5.3.16",
|
||||||
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
|
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz",
|
||||||
"integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
|
"integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/trace-mapping": "^0.3.20",
|
"@jridgewell/trace-mapping": "^0.3.25",
|
||||||
"jest-worker": "^27.4.5",
|
"jest-worker": "^27.4.5",
|
||||||
"schema-utils": "^3.1.1",
|
"schema-utils": "^4.3.0",
|
||||||
"serialize-javascript": "^6.0.1",
|
"serialize-javascript": "^6.0.2",
|
||||||
"terser": "^5.26.0"
|
"terser": "^5.31.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 10.13.0"
|
"node": ">= 10.13.0"
|
||||||
|
|
@ -19776,6 +19865,63 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/terser-webpack-plugin/node_modules/ajv": {
|
||||||
|
"version": "8.17.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
|
||||||
|
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"fast-deep-equal": "^3.1.3",
|
||||||
|
"fast-uri": "^3.0.1",
|
||||||
|
"json-schema-traverse": "^1.0.0",
|
||||||
|
"require-from-string": "^2.0.2"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/epoberezkin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/terser-webpack-plugin/node_modules/ajv-keywords": {
|
||||||
|
"version": "5.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
|
||||||
|
"integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"fast-deep-equal": "^3.1.3"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"ajv": "^8.8.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/terser-webpack-plugin/node_modules/schema-utils": {
|
||||||
|
"version": "4.3.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz",
|
||||||
|
"integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/json-schema": "^7.0.9",
|
||||||
|
"ajv": "^8.9.0",
|
||||||
|
"ajv-formats": "^2.1.1",
|
||||||
|
"ajv-keywords": "^5.1.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 10.13.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/webpack"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/terser/node_modules/commander": {
|
"node_modules/terser/node_modules/commander": {
|
||||||
"version": "2.20.3",
|
"version": "2.20.3",
|
||||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
|
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
|
||||||
|
|
@ -20411,9 +20557,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/update-browserslist-db": {
|
"node_modules/update-browserslist-db": {
|
||||||
"version": "1.1.0",
|
"version": "1.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
|
||||||
"integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
|
"integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -20429,9 +20575,10 @@
|
||||||
"url": "https://github.com/sponsors/ai"
|
"url": "https://github.com/sponsors/ai"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"escalade": "^3.1.2",
|
"escalade": "^3.2.0",
|
||||||
"picocolors": "^1.0.1"
|
"picocolors": "^1.1.1"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"update-browserslist-db": "cli.js"
|
"update-browserslist-db": "cli.js"
|
||||||
|
|
@ -21516,10 +21663,11 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/watchpack": {
|
"node_modules/watchpack": {
|
||||||
"version": "2.4.2",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
|
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz",
|
||||||
"integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
|
"integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"glob-to-regexp": "^0.4.1",
|
"glob-to-regexp": "^0.4.1",
|
||||||
"graceful-fs": "^4.1.2"
|
"graceful-fs": "^4.1.2"
|
||||||
|
|
@ -21556,34 +21704,37 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/webpack": {
|
"node_modules/webpack": {
|
||||||
"version": "5.94.0",
|
"version": "5.105.0",
|
||||||
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz",
|
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz",
|
||||||
"integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==",
|
"integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/estree": "^1.0.5",
|
"@types/eslint-scope": "^3.7.7",
|
||||||
"@webassemblyjs/ast": "^1.12.1",
|
"@types/estree": "^1.0.8",
|
||||||
"@webassemblyjs/wasm-edit": "^1.12.1",
|
"@types/json-schema": "^7.0.15",
|
||||||
"@webassemblyjs/wasm-parser": "^1.12.1",
|
"@webassemblyjs/ast": "^1.14.1",
|
||||||
"acorn": "^8.7.1",
|
"@webassemblyjs/wasm-edit": "^1.14.1",
|
||||||
"acorn-import-attributes": "^1.9.5",
|
"@webassemblyjs/wasm-parser": "^1.14.1",
|
||||||
"browserslist": "^4.21.10",
|
"acorn": "^8.15.0",
|
||||||
|
"acorn-import-phases": "^1.0.3",
|
||||||
|
"browserslist": "^4.28.1",
|
||||||
"chrome-trace-event": "^1.0.2",
|
"chrome-trace-event": "^1.0.2",
|
||||||
"enhanced-resolve": "^5.17.1",
|
"enhanced-resolve": "^5.19.0",
|
||||||
"es-module-lexer": "^1.2.1",
|
"es-module-lexer": "^2.0.0",
|
||||||
"eslint-scope": "5.1.1",
|
"eslint-scope": "5.1.1",
|
||||||
"events": "^3.2.0",
|
"events": "^3.2.0",
|
||||||
"glob-to-regexp": "^0.4.1",
|
"glob-to-regexp": "^0.4.1",
|
||||||
"graceful-fs": "^4.2.11",
|
"graceful-fs": "^4.2.11",
|
||||||
"json-parse-even-better-errors": "^2.3.1",
|
"json-parse-even-better-errors": "^2.3.1",
|
||||||
"loader-runner": "^4.2.0",
|
"loader-runner": "^4.3.1",
|
||||||
"mime-types": "^2.1.27",
|
"mime-types": "^2.1.27",
|
||||||
"neo-async": "^2.6.2",
|
"neo-async": "^2.6.2",
|
||||||
"schema-utils": "^3.2.0",
|
"schema-utils": "^4.3.3",
|
||||||
"tapable": "^2.1.1",
|
"tapable": "^2.3.0",
|
||||||
"terser-webpack-plugin": "^5.3.10",
|
"terser-webpack-plugin": "^5.3.16",
|
||||||
"watchpack": "^2.4.1",
|
"watchpack": "^2.5.1",
|
||||||
"webpack-sources": "^3.2.3"
|
"webpack-sources": "^3.3.3"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"webpack": "bin/webpack.js"
|
"webpack": "bin/webpack.js"
|
||||||
|
|
@ -21945,10 +22096,11 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/webpack-sources": {
|
"node_modules/webpack-sources": {
|
||||||
"version": "3.2.3",
|
"version": "3.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz",
|
||||||
"integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
|
"integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10.13.0"
|
"node": ">=10.13.0"
|
||||||
}
|
}
|
||||||
|
|
@ -21959,6 +22111,70 @@
|
||||||
"integrity": "sha512-h9atBP/bsZohWpHnr+2sic8Iecb60GxftXsWNLLLSqewgIsGzByd2gcIID4nXcG+3tNe4GQG3dLcff3kXupdRA==",
|
"integrity": "sha512-h9atBP/bsZohWpHnr+2sic8Iecb60GxftXsWNLLLSqewgIsGzByd2gcIID4nXcG+3tNe4GQG3dLcff3kXupdRA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/webpack/node_modules/ajv": {
|
||||||
|
"version": "8.17.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
|
||||||
|
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"fast-deep-equal": "^3.1.3",
|
||||||
|
"fast-uri": "^3.0.1",
|
||||||
|
"json-schema-traverse": "^1.0.0",
|
||||||
|
"require-from-string": "^2.0.2"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/epoberezkin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/webpack/node_modules/ajv-keywords": {
|
||||||
|
"version": "5.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
|
||||||
|
"integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"fast-deep-equal": "^3.1.3"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"ajv": "^8.8.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/webpack/node_modules/es-module-lexer": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/webpack/node_modules/json-schema-traverse": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/webpack/node_modules/schema-utils": {
|
||||||
|
"version": "4.3.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz",
|
||||||
|
"integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/json-schema": "^7.0.9",
|
||||||
|
"ajv": "^8.9.0",
|
||||||
|
"ajv-formats": "^2.1.1",
|
||||||
|
"ajv-keywords": "^5.1.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 10.13.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/webpack"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/websocket-driver": {
|
"node_modules/websocket-driver": {
|
||||||
"version": "0.7.4",
|
"version": "0.7.4",
|
||||||
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
|
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,9 @@ const errorMessages = Object.freeze({
|
||||||
STYLE_REQUIRED: 'Vehicle style is required.',
|
STYLE_REQUIRED: 'Vehicle style is required.',
|
||||||
MOBILE_LOCATION_REQUIRED: 'Please enter your service address',
|
MOBILE_LOCATION_REQUIRED: 'Please enter your service address',
|
||||||
DATE_REQUIRED: 'Please select a date',
|
DATE_REQUIRED: 'Please select a date',
|
||||||
TIME_REQUIRED: 'Please select an appointment time.'
|
TIME_REQUIRED: 'Please select an appointment time.',
|
||||||
|
PRIMARY_PHONE_REQUIRED: 'Primary phone number is required.',
|
||||||
|
BAILOUT_EMAIL_ADDRESS_REQUIRED: 'Email address is required.'
|
||||||
});
|
});
|
||||||
|
|
||||||
export default errorMessages;
|
export default errorMessages;
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,9 @@ const globalRules = Object.freeze({
|
||||||
EXTENSION_FORMAT: 'extension-format',
|
EXTENSION_FORMAT: 'extension-format',
|
||||||
ZIP_CODE_REQUIRED: 'zip-code-required',
|
ZIP_CODE_REQUIRED: 'zip-code-required',
|
||||||
ZIP_CODE_SEARCH_FORMAT: 'zip-code-search-format',
|
ZIP_CODE_SEARCH_FORMAT: 'zip-code-search-format',
|
||||||
OPTION_REQUIRED: 'option-required'
|
OPTION_REQUIRED: 'option-required',
|
||||||
|
PRIMARY_PHONE_REQUIRED: 'primary-phone-required',
|
||||||
|
BAILOUT_EMAIL_ADDRESS_REQUIRED: 'bailout-email-address-required'
|
||||||
});
|
});
|
||||||
|
|
||||||
export default globalRules;
|
export default globalRules;
|
||||||
|
|
|
||||||
|
|
@ -53,10 +53,10 @@ export const pageProgressMapper = {
|
||||||
'schedule-page': {
|
'schedule-page': {
|
||||||
percent: 70
|
percent: 70
|
||||||
},
|
},
|
||||||
'contact-details': {
|
|
||||||
percent: 80
|
|
||||||
},
|
|
||||||
'service-packages': {
|
'service-packages': {
|
||||||
|
percent: 75
|
||||||
|
},
|
||||||
|
'contact-details': {
|
||||||
percent: 85
|
percent: 85
|
||||||
},
|
},
|
||||||
'payment-method': {
|
'payment-method': {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
const vinLookupMethodSelections = Object.freeze({
|
const vinLookupMethodSelections = Object.freeze({
|
||||||
MANUALVIN: 'ManualVin',
|
MANUALVIN: 'ManualVin',
|
||||||
LICENSEPLATE: 'LicensePlate',
|
LICENSEPLATE: 'LicensePlate',
|
||||||
HOMEADDRESS: 'HomeAddress'
|
HOMEADDRESS: 'HomeAddress',
|
||||||
|
NOVIN: 'NoVin'
|
||||||
});
|
});
|
||||||
|
|
||||||
export default vinLookupMethodSelections;
|
export default vinLookupMethodSelections;
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,7 @@
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="!suppressError"
|
v-if="!suppressError && errorMessage"
|
||||||
class="row form-test-error mt-1">
|
class="row form-test-error mt-1">
|
||||||
<error-message :name="formatString(groupName)"></error-message>
|
<error-message :name="formatString(groupName)"></error-message>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -559,6 +559,7 @@ export default {
|
||||||
this.selectTimeSlotForDay(timeSlot);
|
this.selectTimeSlotForDay(timeSlot);
|
||||||
},
|
},
|
||||||
async setCalendarData(config = {}) {
|
async setCalendarData(config = {}) {
|
||||||
|
// set selectable dates data
|
||||||
config.initialShopTimeSlotsResponse.days.forEach((selectableDate) => {
|
config.initialShopTimeSlotsResponse.days.forEach((selectableDate) => {
|
||||||
const dateObjectToPush = {
|
const dateObjectToPush = {
|
||||||
date: selectableDate.date,
|
date: selectableDate.date,
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,7 @@ describe('textarea-question.vue', () => {
|
||||||
},
|
},
|
||||||
mixins: [mockMixin]
|
mixins: [mockMixin]
|
||||||
});
|
});
|
||||||
const expected = `${maxLength}/${maxLength}`;
|
const expected = `${maxLength} characters allowed`;
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
// Assert
|
// Assert
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
:id="inputId"
|
:id="inputId"
|
||||||
:ref="inputId"
|
:ref="inputId"
|
||||||
v-model.trim="value"
|
v-model.trim="value"
|
||||||
class="form-control"
|
class="textarea-input"
|
||||||
:name="inputId"
|
:name="inputId"
|
||||||
:rows="[inputRows ?? 10]"
|
:rows="[inputRows ?? 10]"
|
||||||
:placeholder="placeholderText"
|
:placeholder="placeholderText"
|
||||||
|
|
@ -32,8 +32,15 @@
|
||||||
@drop="trimOnPaste">
|
@drop="trimOnPaste">
|
||||||
</textarea>
|
</textarea>
|
||||||
</div>
|
</div>
|
||||||
<p class="character-count margin-top-8">
|
<p
|
||||||
{{ maxLength - characterCount }}/{{ maxLength }} characters remaining
|
v-if="characterCount == 0"
|
||||||
|
class="character-count">
|
||||||
|
{{ maxLength }} characters allowed
|
||||||
|
</p>
|
||||||
|
<p
|
||||||
|
v-else
|
||||||
|
class="character-count">
|
||||||
|
{{ maxLength - characterCount }} characters left
|
||||||
</p>
|
</p>
|
||||||
<div
|
<div
|
||||||
v-show="errorMessage"
|
v-show="errorMessage"
|
||||||
|
|
@ -103,7 +110,7 @@ export default {
|
||||||
computed: {
|
computed: {
|
||||||
/**
|
/**
|
||||||
* @summary Returns the number of characters in the textarea field.
|
* @summary Returns the number of characters in the textarea field.
|
||||||
* @returns {number}
|
* @returns {number} The number of characters.
|
||||||
*/
|
*/
|
||||||
characterCount() {
|
characterCount() {
|
||||||
return this?.modelValue?.length ?? 0;
|
return this?.modelValue?.length ?? 0;
|
||||||
|
|
@ -155,19 +162,18 @@ export default {
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
.form-control {
|
.textarea-input {
|
||||||
max-height: 30rem;
|
padding: .625rem;
|
||||||
border: $border-input;
|
resize: none;
|
||||||
border-radius: $border-radius;
|
margin-bottom: .625rem;
|
||||||
padding: 12px 16px;
|
width: 100%;
|
||||||
letter-spacing: inherit;
|
letter-spacing: inherit;
|
||||||
box-shadow: $box-shadow-input;
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
line-height: 1.375rem;
|
||||||
&::placeholder {
|
&::placeholder {
|
||||||
color: $gray-500;
|
color: $gray-500;
|
||||||
}
|
}
|
||||||
&:focus {
|
|
||||||
border: $border-input-focus;
|
|
||||||
}
|
|
||||||
&:disabled,
|
&:disabled,
|
||||||
&.disabled {
|
&.disabled {
|
||||||
background-color: $gray-100;
|
background-color: $gray-100;
|
||||||
|
|
@ -176,16 +182,13 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
.optional {
|
.optional {
|
||||||
color: $gray-550;
|
font-weight: $font-weight-normal;
|
||||||
|
color: $darker-gray;
|
||||||
}
|
}
|
||||||
|
|
||||||
.character-count {
|
.character-count {
|
||||||
color: $gray-600;
|
color: #4d4e53;
|
||||||
font-size: 12px;
|
font-size: 1rem;
|
||||||
margin-bottom: 0px;
|
line-height: 1.375rem;
|
||||||
}
|
|
||||||
|
|
||||||
.margin-top-8 {
|
|
||||||
margin-top: 8px;
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ function canBailoutNavigateBack() {
|
||||||
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
case BailoutCode.VehicleNotFound:
|
case BailoutCode.VehicleNotFound:
|
||||||
case BailoutCode.DoNotSeeMyShop:
|
case BailoutCode.RequestCallback:
|
||||||
case BailoutCode.TPANotEnabled:
|
case BailoutCode.TPANotEnabled:
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ function defineGlobalNameRules() {
|
||||||
*/
|
*/
|
||||||
function defineGlobalEmailRules() {
|
function defineGlobalEmailRules() {
|
||||||
defineRule(globalRules.EMAIL_ADDRESS_REQUIRED, required(errorMessages.EMAIL_ADDRESS_REQUIRED));
|
defineRule(globalRules.EMAIL_ADDRESS_REQUIRED, required(errorMessages.EMAIL_ADDRESS_REQUIRED));
|
||||||
|
defineRule(globalRules.BAILOUT_EMAIL_ADDRESS_REQUIRED, required(errorMessages.BAILOUT_EMAIL_ADDRESS_REQUIRED));
|
||||||
defineRule(
|
defineRule(
|
||||||
globalRules.EMAIL_ADDRESS_FORMAT,
|
globalRules.EMAIL_ADDRESS_FORMAT,
|
||||||
regex(
|
regex(
|
||||||
|
|
@ -71,6 +72,7 @@ function defineGlobalDateOfLossRules() {
|
||||||
*/
|
*/
|
||||||
function defineGlobalPhoneNumberRules() {
|
function defineGlobalPhoneNumberRules() {
|
||||||
defineRule(globalRules.PHONE_NUMBER_REQUIRED, required(errorMessages.PHONE_NUMBER_REQUIRED));
|
defineRule(globalRules.PHONE_NUMBER_REQUIRED, required(errorMessages.PHONE_NUMBER_REQUIRED));
|
||||||
|
defineRule(globalRules.PRIMARY_PHONE_REQUIRED, required(errorMessages.PRIMARY_PHONE_REQUIRED));
|
||||||
defineRule(
|
defineRule(
|
||||||
globalRules.PHONE_NUMBER_FORMAT,
|
globalRules.PHONE_NUMBER_FORMAT,
|
||||||
regex(
|
regex(
|
||||||
|
|
|
||||||
|
|
@ -33,9 +33,17 @@
|
||||||
ref="siteFooter"
|
ref="siteFooter"
|
||||||
class="mt-5"
|
class="mt-5"
|
||||||
cmsWidgetName="SiteFooterWidget"
|
cmsWidgetName="SiteFooterWidget"
|
||||||
:isForwardActionDisabled="!isMetaValid"
|
:isForwardButtonHidden="!isMetaValid"
|
||||||
@backClicked="handleBackButtonAction"
|
@backClicked="handleBackButtonAction"
|
||||||
@ForwardClicked="handleForwardButtonAction" />
|
@ForwardClicked="handleForwardButtonAction" />
|
||||||
|
<div class="need-help-link-container">
|
||||||
|
<textLink
|
||||||
|
v-if="needHelpLinkText"
|
||||||
|
linkType="navigation"
|
||||||
|
:text="needHelpLinkText"
|
||||||
|
href="#"
|
||||||
|
@clickEvent="handleNeedHelpClick" />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -48,6 +56,8 @@ import alert from '@/ux-components/alert/alert.vue';
|
||||||
import questionChain from '@/digital-components/question-chain/question-chain.vue';
|
import questionChain from '@/digital-components/question-chain/question-chain.vue';
|
||||||
import siteSubHeader from '@/iss-components/site-sub-header/site-sub-header.vue';
|
import siteSubHeader from '@/iss-components/site-sub-header/site-sub-header.vue';
|
||||||
import siteFooter from '@/iss-components/site-footer/site-footer.vue';
|
import siteFooter from '@/iss-components/site-footer/site-footer.vue';
|
||||||
|
import textLink from '@/ux-components/text-link/text-link.vue';
|
||||||
|
import widgetFields from '@/constants/cms-widget-fields';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'questions-page',
|
name: 'questions-page',
|
||||||
|
|
@ -56,7 +66,8 @@ export default {
|
||||||
alert,
|
alert,
|
||||||
questionChain,
|
questionChain,
|
||||||
siteSubHeader,
|
siteSubHeader,
|
||||||
siteFooter
|
siteFooter,
|
||||||
|
textLink
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
isMetaValid: Boolean,
|
isMetaValid: Boolean,
|
||||||
|
|
@ -68,7 +79,7 @@ export default {
|
||||||
loadingText: Array,
|
loadingText: Array,
|
||||||
index: Number
|
index: Number
|
||||||
},
|
},
|
||||||
emits: ['update:modelValue', 'forwardButtonAction', 'back-click'],
|
emits: ['update:modelValue', 'forwardButtonAction', 'back-click', 'need-help-click'],
|
||||||
computed: {
|
computed: {
|
||||||
selectedAnswers: {
|
selectedAnswers: {
|
||||||
get() {
|
get() {
|
||||||
|
|
@ -77,6 +88,9 @@ export default {
|
||||||
set(newValue) {
|
set(newValue) {
|
||||||
this.$emit('update:modelValue', newValue);
|
this.$emit('update:modelValue', newValue);
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
needHelpLinkText() {
|
||||||
|
return this.getCmsContent('NeedHelpLinkWidget', widgetFields.TEXT_BLOCK_WIDGET.TEXT);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
@ -98,6 +112,9 @@ export default {
|
||||||
},
|
},
|
||||||
handleBackButtonAction() {
|
handleBackButtonAction() {
|
||||||
this.$emit('back-click');
|
this.$emit('back-click');
|
||||||
|
},
|
||||||
|
handleNeedHelpClick() {
|
||||||
|
this.$emit('need-help-click');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -122,4 +139,7 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.need-help-link-container {
|
||||||
|
margin-bottom: 2.25rem;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -12,13 +12,14 @@ Object {
|
||||||
"phoneNumber": "6145550909",
|
"phoneNumber": "6145550909",
|
||||||
},
|
},
|
||||||
"rules": Object {
|
"rules": Object {
|
||||||
"email": "email-required|email-address-format",
|
"email": "bailout-email-address-required|email-address-format",
|
||||||
"firstName": "first-name-required",
|
"firstName": "policyholder-first-name-required",
|
||||||
"lastName": "last-name-required",
|
"lastName": "policyholder-last-name-required",
|
||||||
"phoneNumber": "phone-number-required|phone-number-format",
|
"phoneNumber": "primary-phone-required|phone-number-format",
|
||||||
},
|
},
|
||||||
"widget": Object {
|
"widget": Object {
|
||||||
"defaultSiteHeader": "SiteSubHeaderWidget",
|
"defaultSiteHeader": "SiteSubHeaderWidget",
|
||||||
|
"disclaimerText": "DisclaimerWidget",
|
||||||
"noTpa": "ContentGroupNoTPAWidget",
|
"noTpa": "ContentGroupNoTPAWidget",
|
||||||
"notSeeingPreferredShop": "ContentGroupNotSeeingPreferredShop",
|
"notSeeingPreferredShop": "ContentGroupNotSeeingPreferredShop",
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -156,6 +156,16 @@ describe('Bailout page', () => {
|
||||||
// Assert
|
// Assert
|
||||||
expect(siteFooter.exists()).toBeTruthy();
|
expect(siteFooter.exists()).toBeTruthy();
|
||||||
});
|
});
|
||||||
|
test('disclaimer text block', () => {
|
||||||
|
// Arrange
|
||||||
|
const wrapper = shallowMount(bailoutPage, getMountOptions());
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const disclaimerText = wrapper.findComponent({ ref: 'disclaimerText' });
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(disclaimerText.exists()).toBeTruthy();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
describe('computed', () => {
|
describe('computed', () => {
|
||||||
describe('subHeaderCmsWidgetName', () => {
|
describe('subHeaderCmsWidgetName', () => {
|
||||||
|
|
|
||||||
|
|
@ -20,28 +20,34 @@
|
||||||
:subContentProperty="subContentProperty"
|
:subContentProperty="subContentProperty"
|
||||||
class="sub-header-content mt-2 mb-5"
|
class="sub-header-content mt-2 mb-5"
|
||||||
justification="left" />
|
justification="left" />
|
||||||
<textboxQuestion
|
<div class="row">
|
||||||
ref="firstName"
|
<div class="col">
|
||||||
v-model="bailoutPageModel.firstName"
|
<textboxQuestion
|
||||||
class="mb-3"
|
ref="firstName"
|
||||||
inputId="firstNameField"
|
v-model="bailoutPageModel.firstName"
|
||||||
cmsWidgetName="FirstNameQuestion"
|
class="input"
|
||||||
isRequired
|
inputId="firstNameField"
|
||||||
disableAutoFill
|
cmsWidgetName="FirstNameQuestion"
|
||||||
:validationRules="rules.firstName" />
|
isRequired
|
||||||
<textboxQuestion
|
disableAutoFill
|
||||||
ref="lastName"
|
:validationRules="rules.firstName" />
|
||||||
v-model="bailoutPageModel.lastName"
|
</div>
|
||||||
class="mb-3"
|
<div class="col">
|
||||||
inputId="lastNameField"
|
<textboxQuestion
|
||||||
cmsWidgetName="LastNameQuestion"
|
ref="lastName"
|
||||||
isRequired
|
v-model="bailoutPageModel.lastName"
|
||||||
disableAutoFill
|
class="input"
|
||||||
:validationRules="rules.lastName" />
|
inputId="lastNameField"
|
||||||
|
cmsWidgetName="LastNameQuestion"
|
||||||
|
isRequired
|
||||||
|
disableAutoFill
|
||||||
|
:validationRules="rules.lastName" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<textboxQuestion
|
<textboxQuestion
|
||||||
ref="phoneNumber"
|
ref="phoneNumber"
|
||||||
v-model="bailoutPageModel.phoneNumber"
|
v-model="bailoutPageModel.phoneNumber"
|
||||||
class="mb-3"
|
class="input"
|
||||||
inputId="phoneNumberField"
|
inputId="phoneNumberField"
|
||||||
cmsWidgetName="PhoneNumberQuestion"
|
cmsWidgetName="PhoneNumberQuestion"
|
||||||
isRequired
|
isRequired
|
||||||
|
|
@ -51,7 +57,7 @@
|
||||||
<textboxQuestion
|
<textboxQuestion
|
||||||
ref="emailAddress"
|
ref="emailAddress"
|
||||||
v-model="bailoutPageModel.email"
|
v-model="bailoutPageModel.email"
|
||||||
class="mb-3"
|
class="input"
|
||||||
inputId="emailAddressField"
|
inputId="emailAddressField"
|
||||||
cmsWidgetName="EmailAddressQuestion"
|
cmsWidgetName="EmailAddressQuestion"
|
||||||
isRequired
|
isRequired
|
||||||
|
|
@ -65,6 +71,9 @@
|
||||||
:isBackButtonHidden="!canNavigateBack"
|
:isBackButtonHidden="!canNavigateBack"
|
||||||
@backClicked="backButtonAction"
|
@backClicked="backButtonAction"
|
||||||
@ForwardClicked="forwardButtonAction" />
|
@ForwardClicked="forwardButtonAction" />
|
||||||
|
<textBlock
|
||||||
|
ref="disclaimerText"
|
||||||
|
cmsWidgetName="DisclaimerWidget" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -77,6 +86,7 @@ import siteHeader from '@/iss-components/site-header/site-header.vue';
|
||||||
import siteSubHeader from '@/iss-components/site-sub-header/site-sub-header.vue';
|
import siteSubHeader from '@/iss-components/site-sub-header/site-sub-header.vue';
|
||||||
import siteFooter from '@/iss-components/site-footer/site-footer.vue';
|
import siteFooter from '@/iss-components/site-footer/site-footer.vue';
|
||||||
import textboxQuestion from '@/digital-components/textbox-question/textbox-question.vue';
|
import textboxQuestion from '@/digital-components/textbox-question/textbox-question.vue';
|
||||||
|
import textBlock from '@/digital-components/text-block/text-block.vue';
|
||||||
// Supporting files
|
// Supporting files
|
||||||
import BaseFormMixin from '@/mixins/base-form-mixin.js';
|
import BaseFormMixin from '@/mixins/base-form-mixin.js';
|
||||||
import { fetchCmsContentForPage } from '@/helpers/cms-content-helper';
|
import { fetchCmsContentForPage } from '@/helpers/cms-content-helper';
|
||||||
|
|
@ -99,7 +109,8 @@ export default {
|
||||||
siteFooter,
|
siteFooter,
|
||||||
textboxQuestion,
|
textboxQuestion,
|
||||||
// eslint-disable-next-line vue/no-reserved-component-names
|
// eslint-disable-next-line vue/no-reserved-component-names
|
||||||
Form
|
Form,
|
||||||
|
textBlock
|
||||||
},
|
},
|
||||||
mixins: [BaseFormMixin],
|
mixins: [BaseFormMixin],
|
||||||
async beforeRouteEnter(to, from, next) {
|
async beforeRouteEnter(to, from, next) {
|
||||||
|
|
@ -130,13 +141,14 @@ export default {
|
||||||
widget: {
|
widget: {
|
||||||
defaultSiteHeader: 'SiteSubHeaderWidget',
|
defaultSiteHeader: 'SiteSubHeaderWidget',
|
||||||
noTpa: 'ContentGroupNoTPAWidget',
|
noTpa: 'ContentGroupNoTPAWidget',
|
||||||
notSeeingPreferredShop: 'ContentGroupNotSeeingPreferredShop'
|
notSeeingPreferredShop: 'ContentGroupNotSeeingPreferredShop',
|
||||||
|
disclaimerText: 'DisclaimerWidget'
|
||||||
},
|
},
|
||||||
rules: {
|
rules: {
|
||||||
firstName: globalRules.FIRST_NAME_REQUIRED,
|
firstName: globalRules.POLICYHOLDER_FIRST_NAME_REQUIRED,
|
||||||
lastName: globalRules.LAST_NAME_REQUIRED,
|
lastName: globalRules.POLICYHOLDER_LAST_NAME_REQUIRED,
|
||||||
phoneNumber: `${globalRules.PHONE_NUMBER_REQUIRED}|${globalRules.PHONE_NUMBER_FORMAT}`,
|
phoneNumber: `${globalRules.PRIMARY_PHONE_REQUIRED}|${globalRules.PHONE_NUMBER_FORMAT}`,
|
||||||
email: `${globalRules.EMAIL_ADDRESS_REQUIRED}|${globalRules.EMAIL_ADDRESS_FORMAT}`
|
email: `${globalRules.BAILOUT_EMAIL_ADDRESS_REQUIRED}|${globalRules.EMAIL_ADDRESS_FORMAT}`
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
@ -221,9 +233,7 @@ export default {
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss" scoped>
|
||||||
@import '@/styles/bailout-common.scss';
|
|
||||||
|
|
||||||
.iss-heritage-container-width {
|
.iss-heritage-container-width {
|
||||||
.bailout-page-container {
|
.bailout-page-container {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
@ -232,4 +242,12 @@ export default {
|
||||||
padding-right: .9375rem;
|
padding-right: .9375rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.input {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-content-container {
|
||||||
|
margin: 30px 0 30px 0;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ import { fetchCmsContentForPage } from '@/helpers/cms-content-helper';
|
||||||
import issPageValues from '@/router/router-constants/issPage-values.js';
|
import issPageValues from '@/router/router-constants/issPage-values.js';
|
||||||
import settleAllPromises from '@/helpers/layout-helper';
|
import settleAllPromises from '@/helpers/layout-helper';
|
||||||
import { useMainStore } from '@/store';
|
import { useMainStore } from '@/store';
|
||||||
|
import showIssLoadingModal from '@/helpers/loading-modal-helper';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'contact-confirmation',
|
name: 'contact-confirmation',
|
||||||
|
|
@ -47,6 +48,7 @@ export default {
|
||||||
next((vm) => {
|
next((vm) => {
|
||||||
vm.setCmsContent(resultMap.cmsContent);
|
vm.setCmsContent(resultMap.cmsContent);
|
||||||
});
|
});
|
||||||
|
showIssLoadingModal(false);
|
||||||
},
|
},
|
||||||
setup() {
|
setup() {
|
||||||
const mainStore = useMainStore();
|
const mainStore = useMainStore();
|
||||||
|
|
|
||||||
|
|
@ -32,65 +32,175 @@ describe('contactDetails.vue', () => {
|
||||||
// Assert
|
// Assert
|
||||||
expect(siteSubHeader.exists()).toBe(true);
|
expect(siteSubHeader.exists()).toBe(true);
|
||||||
});
|
});
|
||||||
test('Should render first name question subcomponent', () => {
|
test('Should render appointment information alert', () => {
|
||||||
// Arrange
|
// Arrange
|
||||||
const wrapper = shallowMount(contactDetails, getMountOptions());
|
const wrapper = shallowMount(contactDetails, getMountOptions());
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
const firstNameQuestion = wrapper.findComponent({ ref: 'firstNameQuestion' });
|
const appointmentInformationAlert = wrapper.findComponent({ ref: 'appointmentInformationAlert' });
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
expect(firstNameQuestion.exists()).toBe(true);
|
expect(appointmentInformationAlert.exists()).toBe(true);
|
||||||
});
|
});
|
||||||
test('Should render last name question subcomponent', () => {
|
test('Should render same as policy address question subcomponent if service zip is same as customer zip', async () => {
|
||||||
// Arrange
|
// Arrange
|
||||||
const wrapper = shallowMount(contactDetails, getMountOptions());
|
const mountOptions = getMountOptions();
|
||||||
|
|
||||||
// Act
|
const customerStreetAddress = getRandomString(10, 50);
|
||||||
const lastNameQuestion = wrapper.findComponent({ ref: 'lastNameQuestion' });
|
const customerStreetAddress2 = getRandomString(0, 50);
|
||||||
|
const customerCity = getRandomString(4, 20);
|
||||||
// Assert
|
const customerState = getRandomString(2, 2);
|
||||||
expect(lastNameQuestion.exists()).toBe(true);
|
const serviceStreetAddress = getRandomString(10, 50);
|
||||||
});
|
const serviceStreetAddress2 = getRandomString(0, 50);
|
||||||
test('Should render email question subcomponent', () => {
|
const serviceCity = getRandomString(4, 20);
|
||||||
// Arrange
|
const serviceState = getRandomString(2, 2);
|
||||||
const wrapper = shallowMount(contactDetails, getMountOptions());
|
const zipCode = getRandomInt(10000, 99999).toString();
|
||||||
|
const mainInitialState = {
|
||||||
// Act
|
order: {
|
||||||
const emailQuestion = wrapper.findComponent({ ref: 'emailQuestion' });
|
customer: {
|
||||||
|
address: {
|
||||||
// Assert
|
streetAddress: customerStreetAddress,
|
||||||
expect(emailQuestion.exists()).toBe(true);
|
streetAddress2: customerStreetAddress2,
|
||||||
});
|
city: customerCity,
|
||||||
test('Should render phone number question subcomponent', () => {
|
state: customerState,
|
||||||
// Arrange
|
zipCode
|
||||||
const wrapper = shallowMount(contactDetails, getMountOptions());
|
}
|
||||||
|
},
|
||||||
// Act
|
serviceLocation: {
|
||||||
const phoneNumberQuestion = wrapper.findComponent({ ref: 'phoneNumberQuestion' });
|
streetAddress: serviceStreetAddress,
|
||||||
|
streetAddress2: serviceStreetAddress2,
|
||||||
// Assert
|
city: serviceCity,
|
||||||
expect(phoneNumberQuestion.exists()).toBe(true);
|
state: serviceState,
|
||||||
});
|
zipCode
|
||||||
test('Should render text updates checkbox subcomponent', () => {
|
}
|
||||||
// Arrange
|
|
||||||
const checkboxLabel = getRandomString(50, 100);
|
|
||||||
const mockMixin = {
|
|
||||||
methods: {
|
|
||||||
getCmsContent: jest.fn().mockImplementation(() => checkboxLabel),
|
|
||||||
setCmsContent: jest.fn()
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
mountOptions.global.plugins = [createTestingPinia({
|
||||||
|
initialState: {
|
||||||
|
main: mainInitialState
|
||||||
|
}
|
||||||
|
})];
|
||||||
|
const wrapper = shallowMount(contactDetails, mountOptions);
|
||||||
|
|
||||||
|
await wrapper.vm.$nextTick();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const sameAsPolicyAddressQuestion = wrapper.findComponent({ ref: 'sameAsPolicyAddressQuestion' });
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(sameAsPolicyAddressQuestion.exists()).toBe(true);
|
||||||
|
});
|
||||||
|
test('Should not render same as policy address question subcomponent if service zip is different from customer zip', () => {
|
||||||
|
// Arrange
|
||||||
const mountOptions = getMountOptions();
|
const mountOptions = getMountOptions();
|
||||||
mountOptions.mixins = [mockMixin];
|
|
||||||
|
const firstName = getRandomString(4, 15);
|
||||||
|
const lastName = getRandomString(4, 15);
|
||||||
|
const emailAddress = getRandomString(10, 20);
|
||||||
|
const servicePhone = getRandomInt(1000000000, 9999999999).toString();
|
||||||
|
const testZipCode = getRandomInt(10000, 99999);
|
||||||
|
const customerZipCode = testZipCode.toString();
|
||||||
|
const serviceZipCode = (testZipCode + 1).toString();
|
||||||
|
const mainInitialState = {
|
||||||
|
order: {
|
||||||
|
customer: {
|
||||||
|
firstName,
|
||||||
|
lastName,
|
||||||
|
emailAddress,
|
||||||
|
address: {
|
||||||
|
zipCode: customerZipCode
|
||||||
|
}
|
||||||
|
},
|
||||||
|
contactInfo: {
|
||||||
|
servicePhone
|
||||||
|
},
|
||||||
|
serviceLocation: {
|
||||||
|
zipCode: serviceZipCode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
mountOptions.global.plugins = [createTestingPinia({
|
||||||
|
initialState: {
|
||||||
|
main: mainInitialState
|
||||||
|
}
|
||||||
|
})];
|
||||||
const wrapper = shallowMount(contactDetails, mountOptions);
|
const wrapper = shallowMount(contactDetails, mountOptions);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
const textUpdatesCheckbox = wrapper.findComponent({ ref: 'requestTextUpdatesCheckbox' });
|
const sameAsPolicyAddressQuestion = wrapper.findComponent({ ref: 'sameAsPolicyAddressQuestion' });
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
expect(textUpdatesCheckbox.exists()).toBe(true);
|
expect(sameAsPolicyAddressQuestion.exists()).toBe(false);
|
||||||
expect(wrapper.vm.requestTextUpdatesCheckboxText).toBe(`${checkboxLabel}*`);
|
});
|
||||||
|
test('Should render address question subcomponent', () => {
|
||||||
|
// Arrange
|
||||||
|
const wrapper = shallowMount(contactDetails, getMountOptions());
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const addressQuestion = wrapper.findComponent({ ref: 'addressQuestion' });
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(addressQuestion.exists()).toBe(true);
|
||||||
|
});
|
||||||
|
test('Should render apartment question subcomponent', () => {
|
||||||
|
// Arrange
|
||||||
|
const wrapper = shallowMount(contactDetails, getMountOptions());
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const address2Question = wrapper.findComponent({ ref: 'address2Question' });
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(address2Question.exists()).toBe(true);
|
||||||
|
});
|
||||||
|
test('Should render city question subcomponent', () => {
|
||||||
|
// Arrange
|
||||||
|
const wrapper = shallowMount(contactDetails, getMountOptions());
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const cityQuestion = wrapper.findComponent({ ref: 'cityQuestion' });
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(cityQuestion.exists()).toBe(true);
|
||||||
|
});
|
||||||
|
test('Should render state question subcomponent', () => {
|
||||||
|
// Arrange
|
||||||
|
const wrapper = shallowMount(contactDetails, getMountOptions());
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const stateQuestion = wrapper.findComponent({ ref: 'stateQuestion' });
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(stateQuestion.exists()).toBe(true);
|
||||||
|
});
|
||||||
|
test('Should render zip code question subcomponent', () => {
|
||||||
|
// Arrange
|
||||||
|
const wrapper = shallowMount(contactDetails, getMountOptions());
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const zipCodeQuestion = wrapper.findComponent({ ref: 'zipCodeQuestion' });
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(zipCodeQuestion.exists()).toBe(true);
|
||||||
|
});
|
||||||
|
test('Should render change zip code alert', () => {
|
||||||
|
// Arrange
|
||||||
|
const wrapper = shallowMount(contactDetails, getMountOptions());
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const changeZipCodeAlert = wrapper.findComponent({ ref: 'changeZipCodeAlert' });
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(changeZipCodeAlert.exists()).toBe(true);
|
||||||
|
});
|
||||||
|
test('Should render vehicle protected question subcomponent', () => {
|
||||||
|
// Arrange
|
||||||
|
const wrapper = shallowMount(contactDetails, getMountOptions());
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const vehicleProtectedQuestion = wrapper.findComponent({ ref: 'vehicleProtectedQuestion' });
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(vehicleProtectedQuestion.exists()).toBe(true);
|
||||||
});
|
});
|
||||||
test('Should render technician notes textarea question subcomponent', () => {
|
test('Should render technician notes textarea question subcomponent', () => {
|
||||||
// Arrange
|
// Arrange
|
||||||
|
|
@ -102,46 +212,15 @@ describe('contactDetails.vue', () => {
|
||||||
// Assert
|
// Assert
|
||||||
expect(notesQuestion.exists()).toBe(true);
|
expect(notesQuestion.exists()).toBe(true);
|
||||||
});
|
});
|
||||||
test('Should render disclaimer text', () => {
|
test('Should render clearance text subcomponent', () => {
|
||||||
// Arrange
|
|
||||||
const disclaimerText = getRandomString(50, 100);
|
|
||||||
const mockMixin = {
|
|
||||||
methods: {
|
|
||||||
getCmsContent: jest.fn().mockImplementation(() => disclaimerText),
|
|
||||||
setCmsContent: jest.fn()
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const mountOptions = getMountOptions();
|
|
||||||
mountOptions.mixins = [mockMixin];
|
|
||||||
const wrapper = shallowMount(contactDetails, mountOptions);
|
|
||||||
const expectedDisclaimerText = `*${disclaimerText} I also agree to Safelite's`;
|
|
||||||
|
|
||||||
// Act
|
|
||||||
const componentText = wrapper.text();
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
expect(wrapper.vm.textUpdateDisclaimerText).toBe(`*${disclaimerText}`);
|
|
||||||
expect(componentText).toContain(expectedDisclaimerText);
|
|
||||||
});
|
|
||||||
test('Should render privacy policy link', () => {
|
|
||||||
// Arrange
|
// Arrange
|
||||||
const wrapper = shallowMount(contactDetails, getMountOptions());
|
const wrapper = shallowMount(contactDetails, getMountOptions());
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
const privacyPolicyLink = wrapper.findComponent({ ref: 'privacyPolicyLink' });
|
const clearanceText = wrapper.findComponent({ ref: 'clearanceText' });
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
expect(privacyPolicyLink.exists()).toBe(true);
|
expect(clearanceText.exists()).toBe(true);
|
||||||
});
|
|
||||||
test('Should render terms of use link', () => {
|
|
||||||
// Arrange
|
|
||||||
const wrapper = shallowMount(contactDetails, getMountOptions());
|
|
||||||
|
|
||||||
// Act
|
|
||||||
const termsOfUseLink = wrapper.findComponent({ ref: 'termsOfUseLink' });
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
expect(termsOfUseLink.exists()).toBe(true);
|
|
||||||
});
|
});
|
||||||
test('Should render site footer', () => {
|
test('Should render site footer', () => {
|
||||||
// Arrange
|
// Arrange
|
||||||
|
|
@ -153,82 +232,48 @@ describe('contactDetails.vue', () => {
|
||||||
// Assert
|
// Assert
|
||||||
expect(footer.exists()).toBe(true);
|
expect(footer.exists()).toBe(true);
|
||||||
});
|
});
|
||||||
test('Mocked store with no contact info yields expected data', () => {
|
test('Mocked store yields expected data', () => {
|
||||||
// Arrange
|
// Arrange
|
||||||
const mountOptions = getMountOptions();
|
const mountOptions = getMountOptions();
|
||||||
|
|
||||||
const firstName = getRandomString(4, 15);
|
const address = getRandomString(10, 50);
|
||||||
const lastName = getRandomString(4, 15);
|
const address2 = getRandomString(0, 50);
|
||||||
const emailAddress = getRandomString(10, 20);
|
const city = getRandomString(4, 20);
|
||||||
const servicePhone = getRandomInt(1000000000, 9999999999).toString();
|
const state = getRandomString(2, 2);
|
||||||
|
const zipCode = getRandomInt(10000, 99999).toString();
|
||||||
|
const notesForTechnician = getRandomString(1, 100);
|
||||||
|
const isVehicleProtected = getRandomBoolean();
|
||||||
const mainInitialState = {
|
const mainInitialState = {
|
||||||
order: {
|
order: {
|
||||||
customer: {
|
serviceLocation: {
|
||||||
firstName,
|
address,
|
||||||
lastName,
|
address2,
|
||||||
emailAddress
|
city,
|
||||||
|
state,
|
||||||
|
zipCode,
|
||||||
|
isVehicleProtected
|
||||||
},
|
},
|
||||||
contactInfo: {
|
contactInfo: {
|
||||||
servicePhone
|
notesForTechnician
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
mountOptions.global = {
|
mountOptions.global.plugins = [createTestingPinia({
|
||||||
plugins: [createTestingPinia({
|
initialState: {
|
||||||
initialState: {
|
main: mainInitialState
|
||||||
main: mainInitialState
|
}
|
||||||
}
|
})];
|
||||||
})]
|
|
||||||
};
|
|
||||||
|
|
||||||
const wrapper = shallowMount(contactDetails, mountOptions);
|
const wrapper = shallowMount(contactDetails, mountOptions);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
expect(wrapper.vm.firstName).toBe(firstName);
|
expect(wrapper.vm.address).toBe(address);
|
||||||
expect(wrapper.vm.lastName).toBe(lastName);
|
expect(wrapper.vm.address2).toBe(address2);
|
||||||
expect(wrapper.vm.emailAddress).toBe(emailAddress);
|
expect(wrapper.vm.city).toBe(city);
|
||||||
expect(wrapper.vm.phoneNumber).toBe(servicePhone);
|
expect(wrapper.vm.state).toBe(state);
|
||||||
});
|
expect(wrapper.vm.zipCode).toBe(zipCode);
|
||||||
test('Mock store with contact info yields expected data', () => {
|
expect(wrapper.vm.isVehicleProtected).toBe(isVehicleProtected);
|
||||||
// Arrange
|
expect(wrapper.vm.notesForTechnician).toBe(notesForTechnician);
|
||||||
const customer = {
|
|
||||||
firstName: getRandomString(4, 15),
|
|
||||||
lastName: getRandomString(4, 15),
|
|
||||||
emailAddress: getRandomString(10, 20),
|
|
||||||
phoneNumber: getRandomInt(1000000000, 9999999999)
|
|
||||||
};
|
|
||||||
const contactInfo = {
|
|
||||||
firstName: getRandomString(4, 15),
|
|
||||||
lastName: getRandomString(4, 15),
|
|
||||||
emailAddress: getRandomString(10, 20),
|
|
||||||
servicePhone: getRandomInt(1000000000, 9999999999),
|
|
||||||
requestTextUpdates: getRandomBoolean(),
|
|
||||||
notesForTechnician: getRandomString(50, 100)
|
|
||||||
};
|
|
||||||
const mainInitialState = {
|
|
||||||
order: {
|
|
||||||
customer,
|
|
||||||
contactInfo
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const mountOptions = getMountOptions();
|
|
||||||
mountOptions.global = {
|
|
||||||
plugins: [createTestingPinia({
|
|
||||||
initialState: {
|
|
||||||
main: mainInitialState
|
|
||||||
}
|
|
||||||
})]
|
|
||||||
};
|
|
||||||
|
|
||||||
const wrapper = shallowMount(contactDetails, mountOptions);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
expect(wrapper.vm.firstName).toBe(contactInfo.firstName);
|
|
||||||
expect(wrapper.vm.lastName).toBe(contactInfo.lastName);
|
|
||||||
expect(wrapper.vm.emailAddress).toBe(contactInfo.emailAddress);
|
|
||||||
expect(wrapper.vm.phoneNumber).toBe(contactInfo.servicePhone);
|
|
||||||
expect(wrapper.vm.requestTextUpdates).toBe(contactInfo.requestTextUpdates);
|
|
||||||
expect(wrapper.vm.notesForTechnician).toBe(contactInfo.notesForTechnician);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -250,7 +295,7 @@ describe('contactDetails.vue', () => {
|
||||||
expect(wrapper.vm.$router.navigateWithSpinner)
|
expect(wrapper.vm.$router.navigateWithSpinner)
|
||||||
.toHaveBeenCalledWith(navigationScenarios.CLICKED_BACK, undefined);
|
.toHaveBeenCalledWith(navigationScenarios.CLICKED_BACK, undefined);
|
||||||
});
|
});
|
||||||
test('Forward button clicked triggers appropriate navigation when safelite shop', () => {
|
test('Forward button clicked triggers appropriate navigation', () => {
|
||||||
// Arrange
|
// Arrange
|
||||||
const mountOptions = getMountOptions({
|
const mountOptions = getMountOptions({
|
||||||
router: {
|
router: {
|
||||||
|
|
@ -276,37 +321,44 @@ describe('contactDetails.vue', () => {
|
||||||
// Assert
|
// Assert
|
||||||
expect(wrapper.vm.$router.navigate).toHaveBeenCalled();
|
expect(wrapper.vm.$router.navigate).toHaveBeenCalled();
|
||||||
expect(wrapper.vm.$router.navigate)
|
expect(wrapper.vm.$router.navigate)
|
||||||
.toHaveBeenCalledWith(navigationScenarios.CLICKED_FORWARD_WITH_SAFELITE_SHOP, undefined);
|
.toHaveBeenCalledWith(navigationScenarios.CLICKED_FORWARD, undefined);
|
||||||
});
|
});
|
||||||
test('Forward button clicked triggers appropriate navigation when TPA shop', () => {
|
test('Forward button click updates service location info', () => {
|
||||||
// Arrange
|
// Arrange
|
||||||
const mountOptions = getMountOptions({
|
const mountOptions = getMountOptions({
|
||||||
router: {
|
router: {
|
||||||
navigate: jest.fn()
|
navigate: jest.fn()
|
||||||
},
|
}
|
||||||
navigationScenarios
|
|
||||||
});
|
});
|
||||||
const mainInitialState = {
|
|
||||||
order: {
|
|
||||||
serviceLocation: { IsSafeliteProvider: false }
|
|
||||||
}
|
|
||||||
};
|
|
||||||
mountOptions.global.plugins = [createTestingPinia({
|
|
||||||
initialState: {
|
|
||||||
main: mainInitialState
|
|
||||||
}
|
|
||||||
})];
|
|
||||||
const wrapper = shallowMount(contactDetails, mountOptions);
|
const wrapper = shallowMount(contactDetails, mountOptions);
|
||||||
|
const address = getRandomString(10, 50);
|
||||||
|
const address2 = getRandomString(0, 50);
|
||||||
|
const city = getRandomString(4, 20);
|
||||||
|
const state = getRandomString(2, 2);
|
||||||
|
const zipCode = getRandomInt(10000, 99999).toString();
|
||||||
|
const isVehicleProtected = getRandomBoolean().toString();
|
||||||
|
wrapper.setData({
|
||||||
|
address,
|
||||||
|
address2,
|
||||||
|
city,
|
||||||
|
state,
|
||||||
|
zipCode,
|
||||||
|
isVehicleProtected
|
||||||
|
});
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
wrapper.vm.forwardButtonAction();
|
wrapper.vm.forwardButtonAction();
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
expect(wrapper.vm.$router.navigate).toHaveBeenCalled();
|
expect(useMainStore().updateServiceLocation).toHaveBeenCalledWith({
|
||||||
expect(wrapper.vm.$router.navigate)
|
address,
|
||||||
.toHaveBeenCalledWith(navigationScenarios.CLICKED_FORWARD_WITH_NON_SAFELITE_SHOP, undefined);
|
address2,
|
||||||
|
city,
|
||||||
|
isVehicleProtected
|
||||||
|
});
|
||||||
});
|
});
|
||||||
test('Forward button click updates contact info', () => {
|
|
||||||
|
test('Forward button click updates notes for technician', () => {
|
||||||
// Arrange
|
// Arrange
|
||||||
const mountOptions = getMountOptions({
|
const mountOptions = getMountOptions({
|
||||||
router: {
|
router: {
|
||||||
|
|
@ -314,18 +366,8 @@ describe('contactDetails.vue', () => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const wrapper = shallowMount(contactDetails, mountOptions);
|
const wrapper = shallowMount(contactDetails, mountOptions);
|
||||||
const firstName = getRandomString(4, 15);
|
|
||||||
const lastName = getRandomString(4, 15);
|
|
||||||
const emailAddress = getRandomString(10, 20);
|
|
||||||
const phoneNumber = getRandomInt(1000000000, 9999999999).toString();
|
|
||||||
const requestTextUpdates = getRandomBoolean();
|
|
||||||
const notesForTechnician = getRandomString(1, 100);
|
const notesForTechnician = getRandomString(1, 100);
|
||||||
wrapper.setData({
|
wrapper.setData({
|
||||||
firstName,
|
|
||||||
lastName,
|
|
||||||
emailAddress,
|
|
||||||
phoneNumber,
|
|
||||||
requestTextUpdates,
|
|
||||||
notesForTechnician
|
notesForTechnician
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -334,146 +376,8 @@ describe('contactDetails.vue', () => {
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
expect(useMainStore().updateContactInfo).toHaveBeenCalledWith({
|
expect(useMainStore().updateContactInfo).toHaveBeenCalledWith({
|
||||||
firstName,
|
|
||||||
lastName,
|
|
||||||
emailAddress,
|
|
||||||
requestTextUpdates,
|
|
||||||
notesForTechnician
|
notesForTechnician
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Forward button click updates phone numbers request text updates', () => {
|
|
||||||
// Arrange
|
|
||||||
const mountOptions = getMountOptions({
|
|
||||||
router: {
|
|
||||||
navigate: jest.fn()
|
|
||||||
}
|
|
||||||
});
|
|
||||||
const wrapper = shallowMount(contactDetails, mountOptions);
|
|
||||||
const phoneNumber = getRandomInt(1000000000, 9999999999).toString();
|
|
||||||
const requestTextUpdates = true;
|
|
||||||
wrapper.setData({
|
|
||||||
phoneNumber,
|
|
||||||
requestTextUpdates
|
|
||||||
});
|
|
||||||
|
|
||||||
// Act
|
|
||||||
wrapper.vm.forwardButtonAction();
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
expect(useMainStore().updatePhoneNumbers).toHaveBeenCalledWith({
|
|
||||||
service: phoneNumber,
|
|
||||||
alternative: phoneNumber
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Forward button click updates phone numbers dot not request text updates', () => {
|
|
||||||
// Arrange
|
|
||||||
const mountOptions = getMountOptions({
|
|
||||||
router: {
|
|
||||||
navigate: jest.fn()
|
|
||||||
}
|
|
||||||
});
|
|
||||||
const wrapper = shallowMount(contactDetails, mountOptions);
|
|
||||||
const phoneNumber = getRandomInt(1000000000, 9999999999).toString();
|
|
||||||
const requestTextUpdates = false;
|
|
||||||
wrapper.setData({
|
|
||||||
phoneNumber,
|
|
||||||
requestTextUpdates
|
|
||||||
});
|
|
||||||
|
|
||||||
// Act
|
|
||||||
wrapper.vm.forwardButtonAction();
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
expect(useMainStore().updatePhoneNumbers).toHaveBeenCalledWith({
|
|
||||||
home: phoneNumber,
|
|
||||||
service: phoneNumber
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Mocked store with no contact info yields expected data', () => {
|
|
||||||
// Arrange
|
|
||||||
const mountOptions = getMountOptions();
|
|
||||||
|
|
||||||
const firstName = getRandomString(4, 15);
|
|
||||||
const lastName = getRandomString(4, 15);
|
|
||||||
const emailAddress = getRandomString(10, 20);
|
|
||||||
const servicePhone = getRandomInt(1000000000, 9999999999);
|
|
||||||
const mainInitialState = {
|
|
||||||
order: {
|
|
||||||
customer: {
|
|
||||||
firstName,
|
|
||||||
lastName,
|
|
||||||
emailAddress
|
|
||||||
},
|
|
||||||
contactInfo: {
|
|
||||||
firstName: null,
|
|
||||||
lastName: null,
|
|
||||||
emailAddress: null,
|
|
||||||
servicePhone,
|
|
||||||
requestTextUpdates: null,
|
|
||||||
notesForTechnician: null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
mountOptions.global = {
|
|
||||||
plugins: [createTestingPinia({
|
|
||||||
initialState: {
|
|
||||||
main: mainInitialState
|
|
||||||
}
|
|
||||||
})]
|
|
||||||
};
|
|
||||||
|
|
||||||
const wrapper = shallowMount(contactDetails, mountOptions);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
expect(wrapper.vm.firstName).toBe(firstName);
|
|
||||||
expect(wrapper.vm.lastName).toBe(lastName);
|
|
||||||
expect(wrapper.vm.emailAddress).toBe(emailAddress);
|
|
||||||
expect(wrapper.vm.phoneNumber).toBe(servicePhone);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Mock store with contact info yields expected data', () => {
|
|
||||||
// Arrange
|
|
||||||
const customer = {
|
|
||||||
firstName: getRandomString(4, 15),
|
|
||||||
lastName: getRandomString(4, 15),
|
|
||||||
emailAddress: getRandomString(10, 20),
|
|
||||||
phoneNumber: getRandomInt(1000000000, 9999999999)
|
|
||||||
};
|
|
||||||
const contactInfo = {
|
|
||||||
firstName: getRandomString(4, 15),
|
|
||||||
lastName: getRandomString(4, 15),
|
|
||||||
emailAddress: getRandomString(10, 20),
|
|
||||||
servicePhone: getRandomInt(1000000000, 9999999999),
|
|
||||||
requestTextUpdates: getRandomBoolean(),
|
|
||||||
notesForTechnician: getRandomString(50, 100)
|
|
||||||
};
|
|
||||||
const mainInitialState = {
|
|
||||||
order: {
|
|
||||||
customer,
|
|
||||||
contactInfo
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const mountOptions = getMountOptions();
|
|
||||||
mountOptions.global = {
|
|
||||||
plugins: [createTestingPinia({
|
|
||||||
initialState: {
|
|
||||||
main: mainInitialState
|
|
||||||
}
|
|
||||||
})]
|
|
||||||
};
|
|
||||||
|
|
||||||
const wrapper = shallowMount(contactDetails, mountOptions);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
expect(wrapper.vm.firstName).toBe(contactInfo.firstName);
|
|
||||||
expect(wrapper.vm.lastName).toBe(contactInfo.lastName);
|
|
||||||
expect(wrapper.vm.emailAddress).toBe(contactInfo.emailAddress);
|
|
||||||
expect(wrapper.vm.phoneNumber).toBe(contactInfo.servicePhone);
|
|
||||||
expect(wrapper.vm.requestTextUpdates).toBe(contactInfo.requestTextUpdates);
|
|
||||||
expect(wrapper.vm.notesForTechnician).toBe(contactInfo.notesForTechnician);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -15,81 +15,92 @@
|
||||||
<siteSubHeader
|
<siteSubHeader
|
||||||
id="sub-header"
|
id="sub-header"
|
||||||
ref="siteSubHeader"
|
ref="siteSubHeader"
|
||||||
class="mt-4"
|
class="subheader"
|
||||||
:cmsWidgetName="widget.siteSubHeader" />
|
:cmsWidgetName="widget.siteSubHeader" />
|
||||||
<textboxQuestion
|
<!-- TO DO: Use MSR appointment information for MSR -->
|
||||||
ref="firstNameQuestion"
|
<alert
|
||||||
v-model="firstName"
|
ref="appointmentInformationAlert"
|
||||||
class="mt-5"
|
isCollapsible
|
||||||
inputId="firstName"
|
alertClass="alert-warning"
|
||||||
:cmsWidgetName="widget.firstNameQuestion"
|
:cmsWidgetName="widget.appointmentInformation" />
|
||||||
isRequired
|
|
||||||
:validationRules="rules.firstName" />
|
|
||||||
<textboxQuestion
|
|
||||||
ref="lastNameQuestion"
|
|
||||||
v-model="lastName"
|
|
||||||
class="mt-5"
|
|
||||||
inputId="lastName"
|
|
||||||
:cmsWidgetName="widget.lastNameQuestion"
|
|
||||||
isRequired
|
|
||||||
:validationRules="rules.lastName" />
|
|
||||||
<textboxQuestion
|
|
||||||
ref="emailQuestion"
|
|
||||||
v-model="emailAddress"
|
|
||||||
class="mt-5"
|
|
||||||
inputId="emailAddress"
|
|
||||||
:cmsWidgetName="widget.emailQuestion"
|
|
||||||
isRequired
|
|
||||||
:validationRules="rules.emailAddress" />
|
|
||||||
<textboxQuestion
|
|
||||||
ref="phoneNumberQuestion"
|
|
||||||
v-model="phoneNumber"
|
|
||||||
class="mt-5"
|
|
||||||
inputId="phoneNumber"
|
|
||||||
:cmsWidgetName="widget.phoneNumberQuestion"
|
|
||||||
isRequired
|
|
||||||
:mask="phoneMask"
|
|
||||||
:validationRules="rules.phoneNumber" />
|
|
||||||
<checkbox
|
<checkbox
|
||||||
ref="requestTextUpdatesCheckbox"
|
v-if="showSameAsPolicyAddressQuestion"
|
||||||
v-model="requestTextUpdates"
|
ref="sameAsPolicyAddressQuestion"
|
||||||
:isChecked="requestTextUpdates"
|
v-model="isSameAsPolicyAddress"
|
||||||
class="mt-3"
|
checkboxName="sameAsPolicyAddress"
|
||||||
checkboxName="requestTextUpdates"
|
buttonID="sameAsPolicyAddress"
|
||||||
buttonID="requestTextUpdates"
|
class="form-group same-address-checkbox"
|
||||||
:checkboxLabel="requestTextUpdatesCheckboxText" />
|
:checkboxLabel="sameAsPolicyAddressQuestionText" />
|
||||||
|
<textboxQuestion
|
||||||
|
ref="addressQuestion"
|
||||||
|
v-model="address"
|
||||||
|
inputId="address"
|
||||||
|
class="form-group"
|
||||||
|
:cmsWidgetName="widget.streetAddressQuestion"
|
||||||
|
isRequired
|
||||||
|
:validationRules="'street-address-required'" />
|
||||||
|
<textboxQuestion
|
||||||
|
ref="address2Question"
|
||||||
|
v-model="address2"
|
||||||
|
inputId="address2"
|
||||||
|
class="form-group"
|
||||||
|
:cmsWidgetName="widget.apartmentQuestion" />
|
||||||
|
<textboxQuestion
|
||||||
|
ref="cityQuestion"
|
||||||
|
v-model="city"
|
||||||
|
inputId="city"
|
||||||
|
class="form-group"
|
||||||
|
:cmsWidgetName="widget.cityQuestion"
|
||||||
|
isRequired
|
||||||
|
:validationRules="'city-required'" />
|
||||||
|
<dropdownQuestion
|
||||||
|
ref="stateQuestion"
|
||||||
|
v-model="state"
|
||||||
|
inputId="state"
|
||||||
|
class="form-group"
|
||||||
|
:cmsWidgetName="widget.stateQuestion"
|
||||||
|
:options="states"
|
||||||
|
isDisabled />
|
||||||
|
<textboxQuestion
|
||||||
|
ref="zipCodeQuestion"
|
||||||
|
v-model="zipCode"
|
||||||
|
inputId="zipCode"
|
||||||
|
class="form-group"
|
||||||
|
:cmsWidgetName="widget.zipCodeQuestion"
|
||||||
|
isDisabled />
|
||||||
|
<alert
|
||||||
|
ref="changeZipCodeAlert"
|
||||||
|
class="zip-alert"
|
||||||
|
isCollapsible
|
||||||
|
alertClass="alert-warning"
|
||||||
|
:startCollapsed="true"
|
||||||
|
:cmsWidgetName="widget.changeZipCodeAlert" />
|
||||||
|
<buttonQuestion
|
||||||
|
ref="vehicleProtectedQuestion"
|
||||||
|
v-model="isVehicleProtected"
|
||||||
|
inputId="vehicleProtected"
|
||||||
|
class="form-group"
|
||||||
|
isRequired
|
||||||
|
groupName="vehicleProtectedQuestion"
|
||||||
|
:questionText="vehicleProtectedQuestionText"
|
||||||
|
:answers="vehicleProtectedQuestionAnswers"
|
||||||
|
:buttonTypeString="'listButtonHorizontal'" />
|
||||||
|
<textBlock
|
||||||
|
ref="clearanceText"
|
||||||
|
class="clearance-text"
|
||||||
|
:cmsWidgetName="widget.clearanceText" />
|
||||||
<textareaQuestion
|
<textareaQuestion
|
||||||
ref="notesQuestion"
|
ref="notesQuestion"
|
||||||
v-model="notesForTechnician"
|
v-model="notesForTechnician"
|
||||||
class="mt-5"
|
|
||||||
inputId="technicianNotes"
|
inputId="technicianNotes"
|
||||||
|
class="form-group"
|
||||||
:isDisabled="false"
|
:isDisabled="false"
|
||||||
:isRequired="false"
|
:isRequired="false"
|
||||||
:cmsWidgetName="widget.notesQuestion"
|
:cmsWidgetName="widget.notesQuestion"
|
||||||
maxLength="250"
|
maxLength="150"
|
||||||
:inputRows="4" />
|
:inputRows="4" />
|
||||||
<p
|
|
||||||
ref="disclaimerText"
|
|
||||||
class="caption dark-gray mt-5">
|
|
||||||
{{ textUpdateDisclaimerText }} I also agree to
|
|
||||||
Safelite's
|
|
||||||
<textLink
|
|
||||||
ref="privacyPolicyLink"
|
|
||||||
class="normal-line-height"
|
|
||||||
linkType="newWindowLink"
|
|
||||||
text="Privacy Policy"
|
|
||||||
href="//www.safelite.com/privacy-center" />
|
|
||||||
and
|
|
||||||
<textLink
|
|
||||||
ref="termsOfUseLink"
|
|
||||||
class="normal-line-height"
|
|
||||||
linkType="newWindowLink"
|
|
||||||
text="Terms of Use"
|
|
||||||
href="//www.safelite.com/terms-of-use" />.
|
|
||||||
</p>
|
|
||||||
<siteFooter
|
<siteFooter
|
||||||
ref="siteFooter"
|
ref="siteFooter"
|
||||||
class="my-5"
|
|
||||||
:cmsWidgetName="widget.siteFooter"
|
:cmsWidgetName="widget.siteFooter"
|
||||||
:isForwardActionDisabled="!meta.valid"
|
:isForwardActionDisabled="!meta.valid"
|
||||||
@forwardClicked="forwardButtonAction"
|
@forwardClicked="forwardButtonAction"
|
||||||
|
|
@ -107,15 +118,25 @@ import siteSubHeader from '@/iss-components/site-sub-header/site-sub-header.vue'
|
||||||
import textboxQuestion from '@/digital-components/textbox-question/textbox-question.vue';
|
import textboxQuestion from '@/digital-components/textbox-question/textbox-question.vue';
|
||||||
import checkbox from '@/ux-components/checkbox/checkbox.vue';
|
import checkbox from '@/ux-components/checkbox/checkbox.vue';
|
||||||
import textareaQuestion from '@/digital-components/textarea-question/textarea-question.vue';
|
import textareaQuestion from '@/digital-components/textarea-question/textarea-question.vue';
|
||||||
import textLink from '@/ux-components/text-link/text-link.vue';
|
import alert from '@/ux-components/alert/alert.vue';
|
||||||
|
import dropdownQuestion from '@/digital-components/dropdown-question/dropdown-question.vue';
|
||||||
|
import textBlock from '@/digital-components/text-block/text-block.vue';
|
||||||
|
import buttonQuestion from '@/digital-components/button-question/button-question.vue';
|
||||||
|
|
||||||
// Supporting files
|
// Supporting files
|
||||||
import { fetchCmsContentForPage } from '@/helpers/cms-content-helper.js';
|
import { fetchCmsContentForPage } from '@/helpers/cms-content-helper.js';
|
||||||
import { Form } from 'vee-validate';
|
import { defineRule, Form } from 'vee-validate';
|
||||||
import BaseFormMixin from '@/mixins/base-form-mixin.js';
|
import BaseFormMixin from '@/mixins/base-form-mixin.js';
|
||||||
import { useMainStore } from '@/store/index.js';
|
import { useMainStore } from '@/store/index.js';
|
||||||
import globalRules from '@/constants/global-rules.js';
|
|
||||||
import MaskaFormattedMasks from '@/constants/maska-masks';
|
import MaskaFormattedMasks from '@/constants/maska-masks';
|
||||||
|
import errorMessages from '@/constants/error-messages';
|
||||||
|
import { required } from '@/helpers/validation-rules';
|
||||||
|
import widgetFields from '@/constants/cms-widget-fields';
|
||||||
|
import states from '@/constants/states';
|
||||||
|
|
||||||
|
// DEFINE VALIDATION RULES
|
||||||
|
defineRule('street-address-required', required(errorMessages.STREET_ADDRESS_REQUIRED));
|
||||||
|
defineRule('city-required', required(errorMessages.CITY_REQUIRED));
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'contact-details',
|
name: 'contact-details',
|
||||||
|
|
@ -128,7 +149,10 @@ export default {
|
||||||
siteFooter,
|
siteFooter,
|
||||||
// eslint-disable-next-line vue/no-reserved-component-names
|
// eslint-disable-next-line vue/no-reserved-component-names
|
||||||
Form,
|
Form,
|
||||||
textLink
|
alert,
|
||||||
|
buttonQuestion,
|
||||||
|
dropdownQuestion,
|
||||||
|
textBlock
|
||||||
},
|
},
|
||||||
mixins: [BaseFormMixin],
|
mixins: [BaseFormMixin],
|
||||||
async beforeRouteEnter(to, from, next) {
|
async beforeRouteEnter(to, from, next) {
|
||||||
|
|
@ -140,58 +164,70 @@ export default {
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
const {
|
const {
|
||||||
firstName,
|
|
||||||
lastName,
|
|
||||||
emailAddress,
|
|
||||||
servicePhone,
|
|
||||||
requestTextUpdates,
|
|
||||||
notesForTechnician
|
notesForTechnician
|
||||||
} = useMainStore().contactInfo;
|
} = useMainStore().contactInfo;
|
||||||
|
const {
|
||||||
|
address,
|
||||||
|
address2,
|
||||||
|
city,
|
||||||
|
state,
|
||||||
|
zipCode,
|
||||||
|
isVehicleProtected
|
||||||
|
} = useMainStore().serviceLocation;
|
||||||
return {
|
return {
|
||||||
firstName,
|
|
||||||
lastName,
|
|
||||||
emailAddress,
|
|
||||||
phoneNumber: servicePhone,
|
|
||||||
requestTextUpdates,
|
|
||||||
notesForTechnician,
|
notesForTechnician,
|
||||||
|
address,
|
||||||
|
address2,
|
||||||
|
city,
|
||||||
|
state,
|
||||||
|
zipCode,
|
||||||
|
isVehicleProtected: isVehicleProtected ?? '',
|
||||||
|
isSameAsPolicyAddress: false,
|
||||||
widget: {
|
widget: {
|
||||||
siteHeader: 'SiteHeaderWidget',
|
siteHeader: 'SiteHeaderWidget',
|
||||||
siteSubHeader: 'SiteSubHeaderWidget',
|
siteSubHeader: 'SiteSubHeaderWidget',
|
||||||
firstNameQuestion: 'FirstNameQuestionWidget',
|
appointmentInformation: 'AppointmentInformationAlertWidget',
|
||||||
lastNameQuestion: 'LastNameQuestionWidget',
|
MSRAppointmentInformation: 'MSRAppointmentInformationAlertWidget',
|
||||||
|
sameAsPolicyAddressQuestion: 'SameAsPolicyAddressQuestionWidget',
|
||||||
|
streetAddressQuestion: 'StreetAddressQuestionWidget',
|
||||||
|
apartmentQuestion: 'ApartmentQuestionWidget',
|
||||||
emailQuestion: 'EmailQuestionWidget',
|
emailQuestion: 'EmailQuestionWidget',
|
||||||
phoneNumberQuestion: 'PhoneNumberQuestionWidget',
|
cityQuestion: 'CityQuestionWidget',
|
||||||
requestTextUpdates: 'TextContentWidget',
|
stateQuestion: 'StateQuestionWidget',
|
||||||
|
zipCodeQuestion: 'ZipCodeQuestionWidget',
|
||||||
|
changeZipCodeAlert: 'ChangeZipCodeAlertWidget',
|
||||||
|
vehicleProtectedQuestion: 'VehicleProtectedQuestionWidget',
|
||||||
|
clearanceText: 'ClearanceTextWidget',
|
||||||
notesQuestion: 'NotesQuestionWidget',
|
notesQuestion: 'NotesQuestionWidget',
|
||||||
disclaimer: 'TextUpdateDisclaimerWidget',
|
|
||||||
siteFooter: 'SiteFooterWidget'
|
siteFooter: 'SiteFooterWidget'
|
||||||
},
|
},
|
||||||
rules: {
|
states
|
||||||
firstName: globalRules.FIRST_NAME_REQUIRED,
|
|
||||||
lastName: globalRules.LAST_NAME_REQUIRED,
|
|
||||||
emailAddress: `${globalRules.EMAIL_ADDRESS_REQUIRED}|${globalRules.EMAIL_ADDRESS_FORMAT}`,
|
|
||||||
phoneNumber: `${globalRules.PHONE_NUMBER_REQUIRED}|${globalRules.PHONE_NUMBER_FORMAT}`
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
/**
|
|
||||||
* @returns {string} Returns the CMS text associated with the "get text updates" checkbox.
|
|
||||||
*/
|
|
||||||
requestTextUpdatesCheckboxText() {
|
|
||||||
return `${this.getCmsContent(
|
|
||||||
this.widget.requestTextUpdates,
|
|
||||||
'Text'
|
|
||||||
)}*`;
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* @returns {string} Returns the CMS text associated with the "get text updates" checkbox.
|
|
||||||
*/
|
|
||||||
textUpdateDisclaimerText() {
|
|
||||||
return `*${this.getCmsContent(this.widget.disclaimer, 'Text')}`;
|
|
||||||
},
|
|
||||||
phoneMask() {
|
phoneMask() {
|
||||||
return MaskaFormattedMasks.PHONE_NUMBER;
|
return MaskaFormattedMasks.PHONE_NUMBER;
|
||||||
|
},
|
||||||
|
showSameAsPolicyAddressQuestion() {
|
||||||
|
return this.zipCode === useMainStore().customerData.addressQuestions.zipCode;
|
||||||
|
},
|
||||||
|
sameAsPolicyAddressQuestionText() {
|
||||||
|
return this.getCmsContent(this.widget.sameAsPolicyAddressQuestion, widgetFields.INPUT_QUESTION_WIDGET.QUESTION_TEXT);
|
||||||
|
},
|
||||||
|
vehicleProtectedQuestionText() {
|
||||||
|
return this.getCmsContent(this.widget.vehicleProtectedQuestion, widgetFields.INPUT_QUESTION_WIDGET.QUESTION_TEXT);
|
||||||
|
},
|
||||||
|
vehicleProtectedQuestionAnswers() {
|
||||||
|
return this.getCmsContent(this.widget.vehicleProtectedQuestion, widgetFields.INPUT_QUESTION_WIDGET.ANSWERS) || [];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
isSameAsPolicyAddress(newValue) {
|
||||||
|
if (newValue) {
|
||||||
|
this.copyPolicyAddressToServiceLocation();
|
||||||
|
} else {
|
||||||
|
this.clearAddressFields();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
@ -200,34 +236,29 @@ export default {
|
||||||
*/
|
*/
|
||||||
forwardButtonAction() {
|
forwardButtonAction() {
|
||||||
const contactInfo = {
|
const contactInfo = {
|
||||||
firstName: this.firstName,
|
|
||||||
lastName: this.lastName,
|
|
||||||
emailAddress: this.emailAddress,
|
|
||||||
requestTextUpdates: this.requestTextUpdates,
|
|
||||||
notesForTechnician: this.notesForTechnician
|
notesForTechnician: this.notesForTechnician
|
||||||
};
|
};
|
||||||
useMainStore().updateContactInfo(contactInfo);
|
useMainStore().updateContactInfo(contactInfo);
|
||||||
|
|
||||||
if (this.requestTextUpdates) {
|
useMainStore().updateServiceLocation({
|
||||||
useMainStore().updatePhoneNumbers({
|
address: this.address,
|
||||||
service: this.phoneNumber,
|
address2: this.address2,
|
||||||
alternative: this.phoneNumber
|
city: this.city,
|
||||||
});
|
isVehicleProtected: this.isVehicleProtected || 'false'
|
||||||
} else {
|
});
|
||||||
useMainStore().updatePhoneNumbers({
|
|
||||||
home: this.phoneNumber,
|
|
||||||
service: this.phoneNumber
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const scenario =
|
this.$router.navigate(this.navigationScenarios.CLICKED_FORWARD, this.$route);
|
||||||
useMainStore().order.serviceLocation.IsSafeliteProvider
|
},
|
||||||
=== false
|
copyPolicyAddressToServiceLocation() {
|
||||||
? this.navigationScenarios
|
const { addressQuestions } = useMainStore().customerData;
|
||||||
.CLICKED_FORWARD_WITH_NON_SAFELITE_SHOP
|
this.address = addressQuestions.streetAddress;
|
||||||
: this.navigationScenarios
|
this.address2 = addressQuestions.streetAddress2;
|
||||||
.CLICKED_FORWARD_WITH_SAFELITE_SHOP;
|
this.city = addressQuestions.city;
|
||||||
this.$router.navigate(scenario, this.$route);
|
},
|
||||||
|
clearAddressFields() {
|
||||||
|
this.address = '';
|
||||||
|
this.address2 = '';
|
||||||
|
this.city = '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -242,12 +273,48 @@ export default {
|
||||||
padding-right: .9375rem;
|
padding-right: .9375rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.zip-alert {
|
||||||
.dark-gray {
|
:deep(a) {
|
||||||
color: $darker-gray;
|
padding: 0;
|
||||||
|
border-bottom: 1.5px solid #125b7e;
|
||||||
|
color: #125b7e;
|
||||||
|
&:hover, &:focus {
|
||||||
|
border-color: transparent;
|
||||||
|
color: $heritage-blue-secondary;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
.textbox-question {
|
||||||
.normal-line-height {
|
:deep(.form-label:has(strong)) {
|
||||||
line-height: normal;
|
font-weight: $font-weight-normal;
|
||||||
|
color: $darker-gray;
|
||||||
|
strong {
|
||||||
|
font-weight: 600;
|
||||||
|
color: $black;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.subheader {
|
||||||
|
margin: 1.25rem 0;
|
||||||
|
}
|
||||||
|
.form-group {
|
||||||
|
margin-bottom: 1.25rem;
|
||||||
|
}
|
||||||
|
.same-address-checkbox {
|
||||||
|
:deep(.form-check-input) {
|
||||||
|
&:checked + label p,
|
||||||
|
& + label p {
|
||||||
|
font-size: 1rem;
|
||||||
|
font-weight: $font-weight-normal;
|
||||||
|
color: $darker-gray;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.clearance-text {
|
||||||
|
font-size: .875rem;
|
||||||
|
line-height: 1.25rem;
|
||||||
|
margin-top: 0rem;
|
||||||
|
margin-bottom: .3125rem;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -79,12 +79,14 @@ const initialStore = {
|
||||||
isInsurance: true,
|
isInsurance: true,
|
||||||
paymentMethod: paymentMethods.PAY_AT_TIME_OF_SERVICE
|
paymentMethod: paymentMethods.PAY_AT_TIME_OF_SERVICE
|
||||||
},
|
},
|
||||||
contactInfo: {
|
customer: {
|
||||||
firstName: 'Test',
|
firstName: 'Test',
|
||||||
lastName: 'Test',
|
lastName: 'Test',
|
||||||
servicePhone: '111-111-1111',
|
|
||||||
emailAddress: 'test@email.com'
|
emailAddress: 'test@email.com'
|
||||||
},
|
},
|
||||||
|
contactInfo: {
|
||||||
|
servicePhone: '123-456-7890'
|
||||||
|
},
|
||||||
damage: {
|
damage: {
|
||||||
isRepair: false
|
isRepair: false
|
||||||
},
|
},
|
||||||
|
|
@ -138,7 +140,14 @@ const sessionStorage = {
|
||||||
make: 'Honda',
|
make: 'Honda',
|
||||||
model: 'Civic'
|
model: 'Civic'
|
||||||
},
|
},
|
||||||
customer: {},
|
customer: {
|
||||||
|
firstName: 'Test',
|
||||||
|
lastName: 'Test',
|
||||||
|
emailAddress: 'test@email.com'
|
||||||
|
},
|
||||||
|
contactInfo: {
|
||||||
|
servicePhone: '123-456-7890'
|
||||||
|
},
|
||||||
customerPortalLoginToken: 'token',
|
customerPortalLoginToken: 'token',
|
||||||
currentDeductible: {
|
currentDeductible: {
|
||||||
replace: 100,
|
replace: 100,
|
||||||
|
|
|
||||||
|
|
@ -373,7 +373,7 @@ export default {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Contact Info
|
// Contact Info
|
||||||
const { contactInfo } = useMainStore().order;
|
const { contactInfo } = useMainStore();
|
||||||
const contactInfoReqs = !!(
|
const contactInfoReqs = !!(
|
||||||
contactInfo.firstName
|
contactInfo.firstName
|
||||||
&& contactInfo.lastName
|
&& contactInfo.lastName
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,8 @@
|
||||||
:validationRules="rules.optionRequired"
|
:validationRules="rules.optionRequired"
|
||||||
:index="currentGlassIndex"
|
:index="currentGlassIndex"
|
||||||
@forwardButtonAction="forwardButtonAction"
|
@forwardButtonAction="forwardButtonAction"
|
||||||
@backClick="navigateBackByVehicleQuestions" />
|
@backClick="navigateBackByVehicleQuestions"
|
||||||
|
@needHelpClick="requestCallbackBailout" />
|
||||||
</Form>
|
</Form>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
@ -29,6 +30,8 @@ import { Form } from 'vee-validate';
|
||||||
import vehicleQuestionsMixin from '@/mixins/vehicle-questions-mixin';
|
import vehicleQuestionsMixin from '@/mixins/vehicle-questions-mixin';
|
||||||
import BaseFormMixin from '@/mixins/base-form-mixin.js';
|
import BaseFormMixin from '@/mixins/base-form-mixin.js';
|
||||||
import globalRules from '@/constants/global-rules';
|
import globalRules from '@/constants/global-rules';
|
||||||
|
import bailoutMessage from '@/constants/bailoutMessage';
|
||||||
|
import navigationScenarios from '@/router/router-constants/navigation-scenarios';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'part-questions',
|
name: 'part-questions',
|
||||||
|
|
@ -145,6 +148,10 @@ export default {
|
||||||
// TODO KO delete for quote mvp
|
// TODO KO delete for quote mvp
|
||||||
this.navigateForward(glassPartsForStore, null);
|
this.navigateForward(glassPartsForStore, null);
|
||||||
},
|
},
|
||||||
|
requestCallbackBailout() {
|
||||||
|
this.mainStore.setBailout(bailoutMessage.RequestCallback());
|
||||||
|
this.$router.navigate(navigationScenarios.CLICKED_NEED_HELP_WITH_BAILOUT, this.$route);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@
|
||||||
cmsWidgetName="SiteFooterWidget"
|
cmsWidgetName="SiteFooterWidget"
|
||||||
:isForwardActionDisabled="!meta.valid"
|
:isForwardActionDisabled="!meta.valid"
|
||||||
:isStackedVertically="true"
|
:isStackedVertically="true"
|
||||||
@backClicked="navigateBack"
|
@backClicked="backButtonAction"
|
||||||
@ForwardClicked="forwardButtonAction" />
|
@ForwardClicked="forwardButtonAction" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -230,7 +230,7 @@ export default {
|
||||||
const customerReqs = !!(firstName && lastName && emailAddress);
|
const customerReqs = !!(firstName && lastName && emailAddress);
|
||||||
|
|
||||||
// Contact Info
|
// Contact Info
|
||||||
const { contactInfo } = useMainStore().order;
|
const { contactInfo } = useMainStore();
|
||||||
const contactInfoReqs = !!(
|
const contactInfoReqs = !!(
|
||||||
contactInfo.firstName
|
contactInfo.firstName
|
||||||
&& contactInfo.lastName
|
&& contactInfo.lastName
|
||||||
|
|
@ -291,6 +291,15 @@ export default {
|
||||||
{ [routerParams.SKIP_SAVE_SESSION]: true }
|
{ [routerParams.SKIP_SAVE_SESSION]: true }
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
backButtonAction() {
|
||||||
|
const scenario = this.mainStore.isMobileAppointment
|
||||||
|
? this.navigationScenarios.CLICKED_BACK_MOBILE
|
||||||
|
: this.navigationScenarios.CLICKED_BACK_INSHOP;
|
||||||
|
this.$router.navigate(
|
||||||
|
scenario,
|
||||||
|
this.$route
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,7 @@ export default {
|
||||||
return useMainStore().order.serviceLocation.appointmentType;
|
return useMainStore().order.serviceLocation.appointmentType;
|
||||||
},
|
},
|
||||||
customerInfo() {
|
customerInfo() {
|
||||||
return useMainStore().order.contactInfo;
|
return useMainStore().contactInfo;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
|
||||||
|
|
@ -182,10 +182,12 @@ const defaultOrder = {
|
||||||
},
|
},
|
||||||
techNotes: ''
|
techNotes: ''
|
||||||
},
|
},
|
||||||
contactInfo: {
|
customer: {
|
||||||
firstName: 'first',
|
firstName: 'first',
|
||||||
lastName: 'last',
|
lastName: 'last',
|
||||||
emailAddress: 'builddigitaltest@safelite.com',
|
emailAddress: 'builddigitaltest@safelite.com'
|
||||||
|
},
|
||||||
|
contactInfo: {
|
||||||
servicePhone: '555-555-5555'
|
servicePhone: '555-555-5555'
|
||||||
},
|
},
|
||||||
damage: {
|
damage: {
|
||||||
|
|
|
||||||
|
|
@ -479,15 +479,15 @@ export default {
|
||||||
authSignature: '',
|
authSignature: '',
|
||||||
authSignatureStart: '',
|
authSignatureStart: '',
|
||||||
referralSequenceNumber: useMainStore().order.referralSequenceNumber,
|
referralSequenceNumber: useMainStore().order.referralSequenceNumber,
|
||||||
emailAddress: useMainStore().order.contactInfo.emailAddress,
|
emailAddress: useMainStore().contactInfo.emailAddress,
|
||||||
address1: this.getAddress1(),
|
address1: this.getAddress1(),
|
||||||
address2: this.getAddress2(),
|
address2: this.getAddress2(),
|
||||||
city: this.getCity(),
|
city: this.getCity(),
|
||||||
state: this.getState(),
|
state: this.getState(),
|
||||||
zipCode: this.getZipCode(),
|
zipCode: this.getZipCode(),
|
||||||
firstName: useMainStore().order.contactInfo.firstName,
|
firstName: useMainStore().contactInfo.firstName,
|
||||||
lastName: useMainStore().order.contactInfo.lastName,
|
lastName: useMainStore().contactInfo.lastName,
|
||||||
phoneNumber: useMainStore().order.contactInfo.servicePhone,
|
phoneNumber: useMainStore().contactInfo.servicePhone,
|
||||||
ctu: useMainStore().order.serviceLocation.provider?.address?.zipCodeCtu ?? useMainStore().order.serviceLocation.zipCodeCtu,
|
ctu: useMainStore().order.serviceLocation.provider?.address?.zipCodeCtu ?? useMainStore().order.serviceLocation.zipCodeCtu,
|
||||||
referralCorrelationId: useMainStore().order.referralCorrelationId,
|
referralCorrelationId: useMainStore().order.referralCorrelationId,
|
||||||
workOrderNumber: this.getWorkOrderNumber(),
|
workOrderNumber: this.getWorkOrderNumber(),
|
||||||
|
|
@ -593,7 +593,7 @@ export default {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Contact Info
|
// Contact Info
|
||||||
const { contactInfo } = useMainStore().order;
|
const { contactInfo } = useMainStore();
|
||||||
const contactInfoReqs = !!(
|
const contactInfoReqs = !!(
|
||||||
contactInfo.firstName
|
contactInfo.firstName
|
||||||
&& contactInfo.lastName
|
&& contactInfo.lastName
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
ref="serviceLocation"
|
ref="serviceLocation"
|
||||||
@appointmentTypeChanged="appointmentTypeChangedFromServiceLocation"
|
@appointmentTypeChanged="appointmentTypeChangedFromServiceLocation"
|
||||||
@cityUpdated="cityUpdatedFromServiceLocation"
|
@cityUpdated="cityUpdatedFromServiceLocation"
|
||||||
|
@inShopZipUpdated="inShopZipUpdatedFromServiceLocation"
|
||||||
@mobileZipUpdated="mobileZipUpdatedFromServiceLocation"
|
@mobileZipUpdated="mobileZipUpdatedFromServiceLocation"
|
||||||
@providerChanged="providerChangedFromServiceLocation" />
|
@providerChanged="providerChangedFromServiceLocation" />
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -182,7 +183,8 @@ const getAvailableDates = async (
|
||||||
storeAction.payload.endDate,
|
storeAction.payload.endDate,
|
||||||
storeAction.payload.zipCodeOverride
|
storeAction.payload.zipCodeOverride
|
||||||
).catch((error) => {
|
).catch((error) => {
|
||||||
console.log('Error fetching mobile time slots:', error);
|
// eslint-disable-next-line no-console
|
||||||
|
console.warn('Error fetching mobile time slots:', error);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -224,6 +226,8 @@ export default {
|
||||||
const cmsContentPromise = fetchCmsContentForPage(to.query.issPage);
|
const cmsContentPromise = fetchCmsContentForPage(to.query.issPage);
|
||||||
const storeServiceLocation = useMainStore().order.serviceLocation;
|
const storeServiceLocation = useMainStore().order.serviceLocation;
|
||||||
const storeSelectedAppointmentType = storeServiceLocation?.appointmentType;
|
const storeSelectedAppointmentType = storeServiceLocation?.appointmentType;
|
||||||
|
const isMobileAppointment = storeSelectedAppointmentType === AppointmentTypeStrings.MOBILE
|
||||||
|
|| storeSelectedAppointmentType === AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP;
|
||||||
const storeSelectedProvider = storeServiceLocation?.provider;
|
const storeSelectedProvider = storeServiceLocation?.provider;
|
||||||
const serviceZipCode = storeServiceLocation?.zipCode || useMainStore().order.customer.address.zipCode;
|
const serviceZipCode = storeServiceLocation?.zipCode || useMainStore().order.customer.address.zipCode;
|
||||||
const zipCodeData = getZipCodeData(serviceZipCode);
|
const zipCodeData = getZipCodeData(serviceZipCode);
|
||||||
|
|
@ -275,6 +279,9 @@ export default {
|
||||||
// use resultMap to populate layout content.
|
// use resultMap to populate layout content.
|
||||||
const resultMap = await settleAllPromises(promiseResultMap);
|
const resultMap = await settleAllPromises(promiseResultMap);
|
||||||
const serviceLocationData = {
|
const serviceLocationData = {
|
||||||
|
defaultMobileZipCode: isMobileAppointment
|
||||||
|
? storeServiceLocation?.zipCode
|
||||||
|
: '',
|
||||||
glassFees: resultMap.glassFees,
|
glassFees: resultMap.glassFees,
|
||||||
mobileFeePart: resultMap.mobileFeePart,
|
mobileFeePart: resultMap.mobileFeePart,
|
||||||
providers: resultMap.providers,
|
providers: resultMap.providers,
|
||||||
|
|
@ -285,8 +292,6 @@ export default {
|
||||||
next(async (vm) => {
|
next(async (vm) => {
|
||||||
const providerToUse = resultMap.providers?.shopProviders
|
const providerToUse = resultMap.providers?.shopProviders
|
||||||
.find((provider) => provider.providerNumber === storeSelectedProvider?.providerNumber) || resultMap.providers?.shopProviders[0];
|
.find((provider) => provider.providerNumber === storeSelectedProvider?.providerNumber) || resultMap.providers?.shopProviders[0];
|
||||||
const isMobileAppointment = storeSelectedAppointmentType === AppointmentTypeStrings.MOBILE
|
|
||||||
|| storeSelectedAppointmentType === AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP;
|
|
||||||
const initialServiceLocationObj = {
|
const initialServiceLocationObj = {
|
||||||
mobileProviderNumber: isMobileAppointment
|
mobileProviderNumber: isMobileAppointment
|
||||||
? storeSelectedProvider?.providerNumber
|
? storeSelectedProvider?.providerNumber
|
||||||
|
|
@ -314,10 +319,10 @@ export default {
|
||||||
mobileFeePart: null,
|
mobileFeePart: null,
|
||||||
mobilePremiumAppointmentFee: null,
|
mobilePremiumAppointmentFee: null,
|
||||||
mobileProviderNumber: null,
|
mobileProviderNumber: null,
|
||||||
mobileZipCodeOverride: null,
|
|
||||||
selectableDatesData: [],
|
selectableDatesData: [],
|
||||||
selectedAppointmentType: this.getAppointmentType(),
|
selectedAppointmentType: this.getAppointmentType(),
|
||||||
selectedDate: this.getSelectedDate(),
|
selectedDate: this.getSelectedDate(),
|
||||||
|
selectedMobileZipCode: null,
|
||||||
selectedProvider: this.getSelectedProvider(),
|
selectedProvider: this.getSelectedProvider(),
|
||||||
selectedServiceLocation: this.getServiceLocation(),
|
selectedServiceLocation: this.getServiceLocation(),
|
||||||
selectedServiceLocationCity: this.getServiceLocationCity(),
|
selectedServiceLocationCity: this.getServiceLocationCity(),
|
||||||
|
|
@ -401,6 +406,7 @@ export default {
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this.mobileProviderNumber = initialServiceLocationObj.mobileProviderNumber;
|
this.mobileProviderNumber = initialServiceLocationObj.mobileProviderNumber;
|
||||||
|
this.selectedMobileZipCode = initialServiceLocationObj.zipCode;
|
||||||
await this.getDatePickerInitialData().then((initialData) => {
|
await this.getDatePickerInitialData().then((initialData) => {
|
||||||
this.selectableDatesData = initialData.initialShopTimeSlotsResponse;
|
this.selectableDatesData = initialData.initialShopTimeSlotsResponse;
|
||||||
this.$refs.datePicker.setCalendarData(initialData);
|
this.$refs.datePicker.setCalendarData(initialData);
|
||||||
|
|
@ -430,11 +436,18 @@ export default {
|
||||||
return this.mainStore.order?.serviceLocation?.appointmentType;
|
return this.mainStore.order?.serviceLocation?.appointmentType;
|
||||||
},
|
},
|
||||||
async getAvailableDatesMethod(startDate, endDate) {
|
async getAvailableDatesMethod(startDate, endDate) {
|
||||||
|
let mobileProviderNumberToUse = this.mobileProviderNumber;
|
||||||
|
if (this.selectedAppointmentType === AppointmentTypeStrings.MOBILE
|
||||||
|
|| this.selectedAppointmentType === AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP) {
|
||||||
|
mobileProviderNumberToUse = this.selectedServiceLocation.mobileProviderNumber;
|
||||||
|
}
|
||||||
|
|
||||||
const newShopTimeSlots = await getAvailableDates(
|
const newShopTimeSlots = await getAvailableDates(
|
||||||
startDate,
|
startDate,
|
||||||
endDate,
|
endDate,
|
||||||
this.selectedAppointmentType,
|
this.selectedAppointmentType,
|
||||||
this.selectedProvider.providerNumber
|
this.selectedProvider.providerNumber || mobileProviderNumberToUse,
|
||||||
|
this.selectedMobileZipCode
|
||||||
);
|
);
|
||||||
// ADD API CALL RESULTS TO EXISTING DATE DATA
|
// ADD API CALL RESULTS TO EXISTING DATE DATA
|
||||||
this.selectableDatesData.days =
|
this.selectableDatesData.days =
|
||||||
|
|
@ -590,9 +603,17 @@ export default {
|
||||||
handleMqlChange(e) {
|
handleMqlChange(e) {
|
||||||
this.isMobileView = !e.matches;
|
this.isMobileView = !e.matches;
|
||||||
},
|
},
|
||||||
|
inShopZipUpdatedFromServiceLocation(inShopZipServiceLocation) {
|
||||||
|
if (inShopZipServiceLocation) {
|
||||||
|
this.mobileProviderNumber = null;
|
||||||
|
this.selectedMobileZipCode = null;
|
||||||
|
this.selectedServiceLocation = inShopZipServiceLocation;
|
||||||
|
}
|
||||||
|
},
|
||||||
mobileZipUpdatedFromServiceLocation(mobileZipServiceLocation) {
|
mobileZipUpdatedFromServiceLocation(mobileZipServiceLocation) {
|
||||||
if (mobileZipServiceLocation) {
|
if (mobileZipServiceLocation) {
|
||||||
this.mobileProviderNumber = mobileZipServiceLocation.mobileProviderNumber;
|
this.mobileProviderNumber = mobileZipServiceLocation.mobileProviderNumber;
|
||||||
|
this.selectedMobileZipCode = mobileZipServiceLocation.zipCode;
|
||||||
this.selectedServiceLocation = mobileZipServiceLocation;
|
this.selectedServiceLocation = mobileZipServiceLocation;
|
||||||
|
|
||||||
if (mobileZipServiceLocation.refreshDatePicker) {
|
if (mobileZipServiceLocation.refreshDatePicker) {
|
||||||
|
|
|
||||||
|
|
@ -159,7 +159,7 @@ export default {
|
||||||
serviceZipQuestion
|
serviceZipQuestion
|
||||||
},
|
},
|
||||||
mixins: [baseFormMixin],
|
mixins: [baseFormMixin],
|
||||||
emits: ['appointment-type-changed', 'city-updated', 'mobile-zip-updated', 'provider-changed'],
|
emits: ['appointment-type-changed', 'city-updated', 'in-shop-zip-updated', 'mobile-zip-updated', 'provider-changed'],
|
||||||
setup() {
|
setup() {
|
||||||
const mainStore = useMainStore();
|
const mainStore = useMainStore();
|
||||||
return { mainStore };
|
return { mainStore };
|
||||||
|
|
@ -171,6 +171,7 @@ export default {
|
||||||
city: this.getServiceCityFromStore(),
|
city: this.getServiceCityFromStore(),
|
||||||
state: this.getServiceStateFromStore(),
|
state: this.getServiceStateFromStore(),
|
||||||
zipCode: this.getServiceZipCodeFromStore(),
|
zipCode: this.getServiceZipCodeFromStore(),
|
||||||
|
initializingData: false,
|
||||||
isGlassServiceableInshop: null,
|
isGlassServiceableInshop: null,
|
||||||
isRecalibrationServiceableInshop: null,
|
isRecalibrationServiceableInshop: null,
|
||||||
isGlassServiceableMobile: null,
|
isGlassServiceableMobile: null,
|
||||||
|
|
@ -289,7 +290,7 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async mobileZipCode(newZip, oldZip) {
|
async mobileZipCode(newZip, oldZip) {
|
||||||
if (newZip !== '' && newZip !== oldZip) {
|
if (newZip !== '' && newZip !== oldZip && !this.initializingData) {
|
||||||
showIssLoadingModal(true);
|
showIssLoadingModal(true);
|
||||||
await this.updateMobileZip();
|
await this.updateMobileZip();
|
||||||
const updateMobileZipServiceLocationObj = {
|
const updateMobileZipServiceLocationObj = {
|
||||||
|
|
@ -348,8 +349,10 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
initializeComponent(initialData) {
|
async initializeComponent(initialData) {
|
||||||
this.setData(initialData);
|
this.initializingData = true;
|
||||||
|
await this.setData(initialData);
|
||||||
|
this.initializingData = false;
|
||||||
},
|
},
|
||||||
async forwardButtonAction() {
|
async forwardButtonAction() {
|
||||||
let provider = this.selectedProvider;
|
let provider = this.selectedProvider;
|
||||||
|
|
@ -372,9 +375,6 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.mainStore.saveServiceLocation({
|
this.mainStore.saveServiceLocation({
|
||||||
address: this.streetAddress,
|
|
||||||
address2: this.streetAddress2,
|
|
||||||
city: this.city,
|
|
||||||
state: this.state,
|
state: this.state,
|
||||||
zipCode: this.zipCode,
|
zipCode: this.zipCode,
|
||||||
zipCodeCtu: this.zipCodeCtu,
|
zipCodeCtu: this.zipCodeCtu,
|
||||||
|
|
@ -417,6 +417,7 @@ export default {
|
||||||
this.zipCode = newZip;
|
this.zipCode = newZip;
|
||||||
const zipCodeData = await getZipCodeData(this.zipCode);
|
const zipCodeData = await getZipCodeData(this.zipCode);
|
||||||
this.city = zipCodeData.city;
|
this.city = zipCodeData.city;
|
||||||
|
this.state = zipCodeData.state;
|
||||||
this.setCtuForMobile(zipCodeData.zipCodeCtu);
|
this.setCtuForMobile(zipCodeData.zipCodeCtu);
|
||||||
this.setContainsMilitaryBase(zipCodeData.containsMilitaryBase);
|
this.setContainsMilitaryBase(zipCodeData.containsMilitaryBase);
|
||||||
|
|
||||||
|
|
@ -426,6 +427,17 @@ export default {
|
||||||
if (details) {
|
if (details) {
|
||||||
this.setServiceabilityDetails(details);
|
this.setServiceabilityDetails(details);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const inShopZipServiceLocationObj = {
|
||||||
|
appointmentType: AppointmentTypeStrings.IN_SHOP,
|
||||||
|
mobileProviderNumber: null,
|
||||||
|
provider: this.selectedProvider,
|
||||||
|
refreshDatePicker: false,
|
||||||
|
resetDatePicker: false,
|
||||||
|
zipCode: newZip,
|
||||||
|
zipCodeCtu: zipCodeData.zipCodeCtu
|
||||||
|
};
|
||||||
|
this.$emit('in-shop-zip-updated', inShopZipServiceLocationObj);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
refreshAvailabilityRating() {
|
refreshAvailabilityRating() {
|
||||||
|
|
@ -449,11 +461,16 @@ export default {
|
||||||
setCtuForMobile(val) {
|
setCtuForMobile(val) {
|
||||||
this.zipCodeCtu = val;
|
this.zipCodeCtu = val;
|
||||||
},
|
},
|
||||||
setData(initialData) {
|
async setData(initialData) {
|
||||||
|
if (initialData.defaultMobileZipCode) {
|
||||||
|
this.mobileZipCode = initialData.defaultMobileZipCode;
|
||||||
|
}
|
||||||
|
|
||||||
if (initialData.zipCodeData) {
|
if (initialData.zipCodeData) {
|
||||||
this.zipContainsMilitaryBase = initialData.zipCodeData.containsMilitaryBase;
|
this.zipContainsMilitaryBase = initialData.zipCodeData.containsMilitaryBase;
|
||||||
this.zipCodeCtu = initialData.zipCodeData.zipCodeCtu;
|
this.zipCodeCtu = initialData.zipCodeData.zipCodeCtu;
|
||||||
this.city = initialData.zipCodeData.city;
|
this.city = initialData.zipCodeData.city;
|
||||||
|
this.state = initialData.zipCodeData.state;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (initialData.serviceabilityDetails) {
|
if (initialData.serviceabilityDetails) {
|
||||||
|
|
@ -523,6 +540,7 @@ export default {
|
||||||
this.mobileZipError = errorMessages.NO_SERVICE_IN_AREA(toTitleCase(zipCodeData.city));
|
this.mobileZipError = errorMessages.NO_SERVICE_IN_AREA(toTitleCase(zipCodeData.city));
|
||||||
} else {
|
} else {
|
||||||
this.city = zipCodeData.city;
|
this.city = zipCodeData.city;
|
||||||
|
this.state = zipCodeData.state;
|
||||||
this.zipCode = this.mobileZipCode;
|
this.zipCode = this.mobileZipCode;
|
||||||
this.setCtuForMobile(zipCodeData.zipCodeCtu);
|
this.setCtuForMobile(zipCodeData.zipCodeCtu);
|
||||||
this.setContainsMilitaryBase(zipCodeData.containsMilitaryBase);
|
this.setContainsMilitaryBase(zipCodeData.containsMilitaryBase);
|
||||||
|
|
@ -601,12 +619,6 @@ $page-side-padding: 1.5rem;
|
||||||
div.alert {
|
div.alert {
|
||||||
margin-top: 0.625rem;
|
margin-top: 0.625rem;
|
||||||
|
|
||||||
:deep(.alert-header) {
|
|
||||||
button.btn-collapse {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
button.looka-likea-link {
|
button.looka-likea-link {
|
||||||
background: none;
|
background: none;
|
||||||
border: none;
|
border: none;
|
||||||
|
|
|
||||||
|
|
@ -195,8 +195,12 @@ export default {
|
||||||
}
|
}
|
||||||
store.updateVaps(this.selectedVaps);
|
store.updateVaps(this.selectedVaps);
|
||||||
|
|
||||||
|
const scenario = store.isMobileAppointment
|
||||||
|
? this.navigationScenarios.CLICKED_FORWARD_MOBILE
|
||||||
|
: this.navigationScenarios.CLICKED_FORWARD_INSHOP;
|
||||||
|
|
||||||
this.$router.navigate(
|
this.$router.navigate(
|
||||||
this.navigationScenarios.CLICKED_FORWARD,
|
scenario,
|
||||||
this.$route
|
this.$route
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -389,9 +389,9 @@ export default {
|
||||||
return getTpaProvidersResult?.data?.shopProviders ?? [];
|
return getTpaProvidersResult?.data?.shopProviders ?? [];
|
||||||
},
|
},
|
||||||
doNotSeeMyShopLinkClick() {
|
doNotSeeMyShopLinkClick() {
|
||||||
this.mainStore.setBailout(bailoutMessage.doNotSeeMyShop());
|
this.mainStore.setBailout(bailoutMessage.RequestCallback());
|
||||||
this.$router.navigate(
|
this.$router.navigate(
|
||||||
this.navigationScenarios.CLICKED_DO_NOT_SEE_MY_SHOP_LINK,
|
this.navigationScenarios.CLICKED_NEED_HELP,
|
||||||
this.$route
|
this.$route
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -38,10 +38,12 @@ describe('contact-details-drawer', () => {
|
||||||
const servicePhone = '606-009-2943';
|
const servicePhone = '606-009-2943';
|
||||||
const mainInitialState = {
|
const mainInitialState = {
|
||||||
order: {
|
order: {
|
||||||
contactInfo: {
|
customer: {
|
||||||
firstName,
|
firstName,
|
||||||
lastName,
|
lastName,
|
||||||
emailAddress,
|
emailAddress
|
||||||
|
},
|
||||||
|
contactInfo: {
|
||||||
servicePhone
|
servicePhone
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -112,10 +114,12 @@ describe('contact-details-drawer', () => {
|
||||||
const phoneNumber = '123-456-1234';
|
const phoneNumber = '123-456-1234';
|
||||||
const mainInitialState = {
|
const mainInitialState = {
|
||||||
order: {
|
order: {
|
||||||
contactInfo: {
|
customer: {
|
||||||
firstName,
|
firstName,
|
||||||
lastName,
|
lastName,
|
||||||
emailAddress,
|
emailAddress
|
||||||
|
},
|
||||||
|
contactInfo: {
|
||||||
phoneNumber
|
phoneNumber
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -388,10 +388,12 @@ describe('tpa-submit', () => {
|
||||||
companyName: providerCompanyName
|
companyName: providerCompanyName
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
contactInfo: {
|
customer: {
|
||||||
firstName,
|
firstName,
|
||||||
lastName,
|
lastName,
|
||||||
emailAddress,
|
emailAddress
|
||||||
|
},
|
||||||
|
contactInfo: {
|
||||||
servicePhone
|
servicePhone
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -433,10 +435,12 @@ describe('tpa-submit', () => {
|
||||||
companyName: providerCompanyName
|
companyName: providerCompanyName
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
contactInfo: {
|
customer: {
|
||||||
firstName,
|
firstName,
|
||||||
lastName,
|
lastName,
|
||||||
emailAddress,
|
emailAddress
|
||||||
|
},
|
||||||
|
contactInfo: {
|
||||||
servicePhone,
|
servicePhone,
|
||||||
extension
|
extension
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import errorMessages from '@/constants/error-messages';
|
||||||
import globalRules from '@/constants/global-rules';
|
import globalRules from '@/constants/global-rules';
|
||||||
import { required } from '@/helpers/validation-rules';
|
import { required } from '@/helpers/validation-rules';
|
||||||
import VehicleLookup from '@/layouts/vehicle-lookup/vehicle-lookup.vue';
|
import VehicleLookup from '@/layouts/vehicle-lookup/vehicle-lookup.vue';
|
||||||
|
import vehicleQuestionsMixin from '@/mixins/vehicle-questions-mixin';
|
||||||
|
|
||||||
const pinia = createTestingPinia();
|
const pinia = createTestingPinia();
|
||||||
useMainStore(pinia);
|
useMainStore(pinia);
|
||||||
|
|
@ -40,6 +41,13 @@ const vinLookupMethodsMockData = {
|
||||||
SubText: 'Most convenient VIN match',
|
SubText: 'Most convenient VIN match',
|
||||||
ImageId: '',
|
ImageId: '',
|
||||||
SubWidgetName: ''
|
SubWidgetName: ''
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: 'NoVin',
|
||||||
|
Text: 'I\'d prefer not to share my VIN',
|
||||||
|
SubText: '',
|
||||||
|
ImageId: '',
|
||||||
|
SubWidgetName: ''
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
@ -118,7 +126,8 @@ function setupMocks() {
|
||||||
},
|
},
|
||||||
stubs: {
|
stubs: {
|
||||||
SiteHeader: true,
|
SiteHeader: true,
|
||||||
SiteSubHeader: true
|
SiteSubHeader: true,
|
||||||
|
TextBlock: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -264,6 +273,29 @@ describe('vehicle-lookup.vue', () => {
|
||||||
* Currently just trust that our custom navigate() method does its job properly.
|
* Currently just trust that our custom navigate() method does its job properly.
|
||||||
*/
|
*/
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Select "I\'d prefer not to share my VIN" then click "Continue". Calls navigateForward from vehicleQuestionsMixin', async () => {
|
||||||
|
useMainStore().getPartsOrQuestions = () => ({ data: { partsOrQuestions: [] } });
|
||||||
|
navigateSpy = jest.spyOn(vehicleQuestionsMixin.methods, 'navigateForward').mockImplementation(async () => {});
|
||||||
|
const { wrapper } = setupMocks();
|
||||||
|
|
||||||
|
const vinLookupMethodsWrapper = wrapper.findComponent({ name: 'vin-lookup-methods' });
|
||||||
|
// Not using initializeComponent() because it doesn't trigger reactivity in test.
|
||||||
|
await vinLookupMethodsWrapper.setData({
|
||||||
|
questionTextFromCms: vinLookupMethodsMockData.QuestionText,
|
||||||
|
answersFromCms: vinLookupMethodsMockData.Answers
|
||||||
|
});
|
||||||
|
|
||||||
|
const noVinOptionLabel = wrapper
|
||||||
|
.find('[data-test-id="vin-lookup-methods-button-question"] label[for="VinLookupMethods-NoVin"]');
|
||||||
|
await noVinOptionLabel.trigger('mousedown');
|
||||||
|
|
||||||
|
const continueButton = wrapper.get('[data-test-id="site-footer-main-button"]');
|
||||||
|
await continueButton.trigger('click');
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(navigateSpy).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To Do: Error message is not displayed when running test
|
* To Do: Error message is not displayed when running test
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,8 @@
|
||||||
<div class="vehicle-lookup-container iss-heritage-content-container-width">
|
<div class="vehicle-lookup-container iss-heritage-content-container-width">
|
||||||
<SiteSubHeader
|
<SiteSubHeader
|
||||||
cmsWidgetName="SiteSubHeaderWidget"
|
cmsWidgetName="SiteSubHeaderWidget"
|
||||||
class="mt-4"
|
class="subheader mt-4"
|
||||||
subHeaderMarginClasses="mt-1" />
|
subHeaderMarginClasses="mt-4" />
|
||||||
<VinLookupMethods
|
<VinLookupMethods
|
||||||
ref="VinLookupMethods"
|
ref="VinLookupMethods"
|
||||||
v-model="selectedVinLookupMethod"
|
v-model="selectedVinLookupMethod"
|
||||||
|
|
@ -23,6 +23,9 @@
|
||||||
class="mt-5"
|
class="mt-5"
|
||||||
@backClicked="navigateBack"
|
@backClicked="navigateBack"
|
||||||
@forwardClicked="forwardButtonAction" />
|
@forwardClicked="forwardButtonAction" />
|
||||||
|
<TextBlock
|
||||||
|
cmsWidgetName="SecurityTextWidget"
|
||||||
|
class="security-text" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -35,6 +38,7 @@ import { fetchCmsContentForPage } from '@/helpers/cms-content-helper';
|
||||||
import settleAllPromises from '@/helpers/layout-helper';
|
import settleAllPromises from '@/helpers/layout-helper';
|
||||||
import { Form } from 'vee-validate';
|
import { Form } from 'vee-validate';
|
||||||
import BaseFormMixin from '@/mixins/base-form-mixin';
|
import BaseFormMixin from '@/mixins/base-form-mixin';
|
||||||
|
import vehicleQuestionsMixin from '@/mixins/vehicle-questions-mixin';
|
||||||
import vinLookupMethodSelections from '@/constants/vin-lookup-methods';
|
import vinLookupMethodSelections from '@/constants/vin-lookup-methods';
|
||||||
|
|
||||||
// Import Component
|
// Import Component
|
||||||
|
|
@ -42,6 +46,7 @@ import SiteFooter from '@/iss-components/site-footer/site-footer.vue';
|
||||||
import siteHeader from '@/iss-components/site-header/site-header.vue';
|
import siteHeader from '@/iss-components/site-header/site-header.vue';
|
||||||
import SiteSubHeader from '@/iss-components/site-sub-header/site-sub-header.vue';
|
import SiteSubHeader from '@/iss-components/site-sub-header/site-sub-header.vue';
|
||||||
import VinLookupMethods from '@/layouts/vehicle-lookup/vin-lookup-methods/vin-lookup-methods.vue';
|
import VinLookupMethods from '@/layouts/vehicle-lookup/vin-lookup-methods/vin-lookup-methods.vue';
|
||||||
|
import TextBlock from '@/digital-components/text-block/text-block.vue';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'vehicle-lookup',
|
name: 'vehicle-lookup',
|
||||||
|
|
@ -51,9 +56,10 @@ export default {
|
||||||
SiteFooter,
|
SiteFooter,
|
||||||
siteHeader,
|
siteHeader,
|
||||||
SiteSubHeader,
|
SiteSubHeader,
|
||||||
VinLookupMethods
|
VinLookupMethods,
|
||||||
|
TextBlock
|
||||||
},
|
},
|
||||||
mixins: [BaseFormMixin],
|
mixins: [BaseFormMixin, vehicleQuestionsMixin],
|
||||||
async beforeRouteEnter(to, from, next) {
|
async beforeRouteEnter(to, from, next) {
|
||||||
const cmsContentPromise = fetchCmsContentForPage(to.query.issPage);
|
const cmsContentPromise = fetchCmsContentForPage(to.query.issPage);
|
||||||
|
|
||||||
|
|
@ -86,7 +92,7 @@ export default {
|
||||||
arePagePrerequisiteValid() {
|
arePagePrerequisiteValid() {
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
forwardButtonAction() {
|
async forwardButtonAction() {
|
||||||
switch (this.selectedVinLookupMethod) {
|
switch (this.selectedVinLookupMethod) {
|
||||||
case vinLookupMethodSelections.MANUALVIN:
|
case vinLookupMethodSelections.MANUALVIN:
|
||||||
this.$router.navigate(
|
this.$router.navigate(
|
||||||
|
|
@ -106,6 +112,24 @@ export default {
|
||||||
this.$route
|
this.$route
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
case vinLookupMethodSelections.NOVIN:
|
||||||
|
const partsOrQuestionsResponse = await this.getPartsOrQuestions();
|
||||||
|
if (partsOrQuestionsResponse.error) {
|
||||||
|
this.mainStore.setBailout(bailoutMessage.PartsServiceError(partsOrQuestionsResponse.error.data));
|
||||||
|
window.console.error('Error on retrieving PartsOrQuestions');
|
||||||
|
this.hasBailedOut = true;
|
||||||
|
this.$router.navigate(
|
||||||
|
this.navigationScenarios.CLICKED_FORWARD_WITH_BAILOUT,
|
||||||
|
this.$route
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
await this.navigateForward(
|
||||||
|
partsOrQuestionsResponse.data.partsOrQuestions,
|
||||||
|
this
|
||||||
|
);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -124,5 +148,23 @@ export default {
|
||||||
padding-right: .9375rem;
|
padding-right: .9375rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.subheader {
|
||||||
|
:deep(.all-caps) {
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
:deep(.subheader-secondary>p) {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.security-text {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
:deep(a) {
|
||||||
|
font-weight: $font-weight-normal;
|
||||||
|
color: $heritage-blue-primary;
|
||||||
|
&:hover {
|
||||||
|
color: #125b7e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
<template>
|
<template>
|
||||||
<ButtonQuestion
|
<ButtonQuestion
|
||||||
|
class="vin-lookup-methods-question"
|
||||||
v-model="selectedValue"
|
v-model="selectedValue"
|
||||||
:answers="answersFromCms"
|
:answers="answersFromCms"
|
||||||
groupName="VinLookupMethodsOption"
|
groupName="VinLookupMethodsOption"
|
||||||
buttonTypeString="listButton"
|
buttonTypeString="listButton"
|
||||||
:questionText="questionTextFromCms"
|
:questionText="questionTextFromCms"
|
||||||
:questionTextClasses="['text-center']"
|
|
||||||
isRequired
|
isRequired
|
||||||
:validationRules="rules.optionRequired"
|
:validationRules="rules.optionRequired"
|
||||||
data-test-id="vin-lookup-methods-button-question" />
|
data-test-id="vin-lookup-methods-button-question" />
|
||||||
|
|
@ -83,3 +83,18 @@ export default {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.vin-lookup-methods-question {
|
||||||
|
:deep(.question-text) {
|
||||||
|
font-weight: 600;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
:deep(.list-button) {
|
||||||
|
.list-button-content,
|
||||||
|
input[type="radio"]:checked + .list-button-content {
|
||||||
|
color: $black;
|
||||||
|
font-weight: $font-weight-semibold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -509,7 +509,6 @@ form {
|
||||||
:deep(.input-wrapper) {
|
:deep(.input-wrapper) {
|
||||||
input[type="date"]::-webkit-calendar-picker-indicator {
|
input[type="date"]::-webkit-calendar-picker-indicator {
|
||||||
background-color: $svg-calendar-error-fill-color;
|
background-color: $svg-calendar-error-fill-color;
|
||||||
// eslint-disable-next-line max-len
|
|
||||||
background-image: url($svg-error-calendar-graphic);
|
background-image: url($svg-error-calendar-graphic);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -73,7 +73,7 @@ const navigationScenarios = Object.freeze({
|
||||||
PRICING_LOOKUP_ERROR: 'PRICING_LOOKUP_ERROR',
|
PRICING_LOOKUP_ERROR: 'PRICING_LOOKUP_ERROR',
|
||||||
|
|
||||||
// TPA Search
|
// TPA Search
|
||||||
CLICKED_DO_NOT_SEE_MY_SHOP_LINK: 'CLICKED_DO_NOT_SEE_MY_SHOP_LINK',
|
CLICKED_NEED_HELP: 'CLICKED_NEED_HELP',
|
||||||
CLICKED_FORWARD_WITH_SAFELITE_SHOP: 'CLICKED_FORWARD_WITH_SAFELITE_SHOP',
|
CLICKED_FORWARD_WITH_SAFELITE_SHOP: 'CLICKED_FORWARD_WITH_SAFELITE_SHOP',
|
||||||
CLICKED_FORWARD_WITH_NON_SAFELITE_SHOP: 'CLICKED_FORWARD_WITH_NON_SAFELITE_SHOP',
|
CLICKED_FORWARD_WITH_NON_SAFELITE_SHOP: 'CLICKED_FORWARD_WITH_NON_SAFELITE_SHOP',
|
||||||
|
|
||||||
|
|
@ -90,6 +90,10 @@ const navigationScenarios = Object.freeze({
|
||||||
CLICKED_FORWARD_WITH_TPA_DISABLED: 'CLICKED_FORWARD_WITH_TPA_DISABLED',
|
CLICKED_FORWARD_WITH_TPA_DISABLED: 'CLICKED_FORWARD_WITH_TPA_DISABLED',
|
||||||
CLICKED_FORWARD_WITH_POLICY_AND_VEHICLES: 'CLICKED_FORWARD_WITH_POLICY_AND_VEHICLES',
|
CLICKED_FORWARD_WITH_POLICY_AND_VEHICLES: 'CLICKED_FORWARD_WITH_POLICY_AND_VEHICLES',
|
||||||
|
|
||||||
|
// Service Package
|
||||||
|
CLICKED_FORWARD_INSHOP: 'CLICKED_FORWARD_INSHOP',
|
||||||
|
CLICKED_FORWARD_MOBILE: 'CLICKED_FORWARD_MOBILE',
|
||||||
|
|
||||||
// Review Page
|
// Review Page
|
||||||
CLICKED_CUSTOMER_EDIT: 'CLICKED_CUSTOMER_EDIT',
|
CLICKED_CUSTOMER_EDIT: 'CLICKED_CUSTOMER_EDIT',
|
||||||
CLICKED_DAMAGE_EDIT: 'CLICKED_DAMAGE_EDIT',
|
CLICKED_DAMAGE_EDIT: 'CLICKED_DAMAGE_EDIT',
|
||||||
|
|
@ -99,13 +103,16 @@ const navigationScenarios = Object.freeze({
|
||||||
CLICKED_VEHICLE_EDIT: 'CLICKED_VEHICLE_EDIT',
|
CLICKED_VEHICLE_EDIT: 'CLICKED_VEHICLE_EDIT',
|
||||||
|
|
||||||
// Payment
|
// Payment
|
||||||
|
CLICKED_BACK_INSHOP: 'CLICKED_BACK_INSHOP',
|
||||||
|
CLICKED_BACK_MOBILE: 'CLICKED_BACK_MOBILE',
|
||||||
CLICKED_PAY_NOW: 'CLICKED_PAY_NOW',
|
CLICKED_PAY_NOW: 'CLICKED_PAY_NOW',
|
||||||
PAY_IN_ADVANCE_ERROR: 'PAY_IN_ADVANCE_ERROR',
|
PAY_IN_ADVANCE_ERROR: 'PAY_IN_ADVANCE_ERROR',
|
||||||
PAY_IN_ADVANCE_CREDIT_CARD_ERROR: 'PAY_IN_ADVANCE_CREDIT_CARD_ERROR',
|
PAY_IN_ADVANCE_CREDIT_CARD_ERROR: 'PAY_IN_ADVANCE_CREDIT_CARD_ERROR',
|
||||||
PAY_IN_ADVANCE_SUCCESS: 'PAY_IN_ADVANCE_SUCCESS',
|
PAY_IN_ADVANCE_SUCCESS: 'PAY_IN_ADVANCE_SUCCESS',
|
||||||
|
|
||||||
// Bailout
|
// Bailout
|
||||||
CLICKED_FORWARD_WITH_BAILOUT: 'CLICKED_FORWARD_WITH_BAILOUT'
|
CLICKED_FORWARD_WITH_BAILOUT: 'CLICKED_FORWARD_WITH_BAILOUT',
|
||||||
|
CLICKED_NEED_HELP_WITH_BAILOUT: 'CLICKED_NEED_HELP_WITH_BAILOUT',
|
||||||
});
|
});
|
||||||
|
|
||||||
export default navigationScenarios;
|
export default navigationScenarios;
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,26 @@ const routingTable = () => [
|
||||||
{
|
{
|
||||||
scenario: navigationScenarios.SELECTED_HOME_ADDRESS,
|
scenario: navigationScenarios.SELECTED_HOME_ADDRESS,
|
||||||
destinationIssPageValue: issPageValues.ADDRESS_LOOKUP
|
destinationIssPageValue: issPageValues.ADDRESS_LOOKUP
|
||||||
|
},
|
||||||
|
{
|
||||||
|
scenario: navigationScenarios.CLICKED_FORWARD_WITH_PART_QUESTIONS,
|
||||||
|
destinationIssPageValue: issPageValues.PART_QUESTIONS
|
||||||
|
},
|
||||||
|
{
|
||||||
|
scenario: navigationScenarios.CLICKED_FORWARD_WITH_MULTIPLE_PARTS_TO_CHOOSE,
|
||||||
|
destinationIssPageValue: issPageValues.VEHICLE_PARTS
|
||||||
|
},
|
||||||
|
{
|
||||||
|
scenario: navigationScenarios.CLICKED_FORWARD_WITH_MOLDING_QUESTIONS,
|
||||||
|
destinationIssPageValue: issPageValues.MOLDING_QUESTIONS
|
||||||
|
},
|
||||||
|
{
|
||||||
|
scenario: navigationScenarios.CLICKED_FORWARD_WITH_CAPABILITY_QUESTIONS,
|
||||||
|
destinationIssPageValue: issPageValues.CAPABILITY_QUESTIONS
|
||||||
|
},
|
||||||
|
{
|
||||||
|
scenario: navigationScenarios.CLICKED_FORWARD_WITH_NO_MORE_QUESTIONS,
|
||||||
|
destinationIssPageValue: issPageValues.COVERAGE_STATEMENT
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
@ -191,6 +211,10 @@ const routingTable = () => [
|
||||||
{
|
{
|
||||||
scenario: navigationScenarios.CLICKED_FORWARD_WITH_NO_MORE_QUESTIONS,
|
scenario: navigationScenarios.CLICKED_FORWARD_WITH_NO_MORE_QUESTIONS,
|
||||||
destinationIssPageValue: issPageValues.COVERAGE_STATEMENT
|
destinationIssPageValue: issPageValues.COVERAGE_STATEMENT
|
||||||
|
},
|
||||||
|
{
|
||||||
|
scenario: navigationScenarios.CLICKED_NEED_HELP_WITH_BAILOUT,
|
||||||
|
destinationIssPageValue: issPageValues.BAILOUT_PAGE
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
@ -584,7 +608,7 @@ const routingTable = () => [
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
scenario: navigationScenarios.CLICKED_FORWARD,
|
scenario: navigationScenarios.CLICKED_FORWARD,
|
||||||
destinationIssPageValue: issPageValues.CONTACT_DETAILS
|
destinationIssPageValue: issPageValues.SERVICE_PACKAGES
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
@ -596,12 +620,8 @@ const routingTable = () => [
|
||||||
destinationIssPageValue: issPageValues.SCHEDULE_PAGE
|
destinationIssPageValue: issPageValues.SCHEDULE_PAGE
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
scenario: navigationScenarios.CLICKED_FORWARD_WITH_SAFELITE_SHOP,
|
scenario: navigationScenarios.CLICKED_FORWARD,
|
||||||
destinationIssPageValue: issPageValues.SERVICE_PACKAGES
|
destinationIssPageValue: issPageValues.PAYMENT_METHOD
|
||||||
},
|
|
||||||
{
|
|
||||||
scenario: navigationScenarios.CLICKED_FORWARD_WITH_NON_SAFELITE_SHOP,
|
|
||||||
destinationIssPageValue: issPageValues.TPA_SUBMIT
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
@ -610,11 +630,15 @@ const routingTable = () => [
|
||||||
maps: [
|
maps: [
|
||||||
{
|
{
|
||||||
scenario: navigationScenarios.CLICKED_BACK,
|
scenario: navigationScenarios.CLICKED_BACK,
|
||||||
destinationIssPageValue: issPageValues.CONTACT_DETAILS
|
destinationIssPageValue: issPageValues.SCHEDULE_PAGE
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
scenario: navigationScenarios.CLICKED_FORWARD,
|
scenario: navigationScenarios.CLICKED_FORWARD_INSHOP,
|
||||||
destinationIssPageValue: issPageValues.PAYMENT_METHOD
|
destinationIssPageValue: issPageValues.PAYMENT_METHOD
|
||||||
|
},
|
||||||
|
{
|
||||||
|
scenario: navigationScenarios.CLICKED_FORWARD_MOBILE,
|
||||||
|
destinationIssPageValue: issPageValues.CONTACT_DETAILS
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
@ -622,9 +646,13 @@ const routingTable = () => [
|
||||||
issPageValue: issPageValues.PAYMENT_METHOD,
|
issPageValue: issPageValues.PAYMENT_METHOD,
|
||||||
maps: [
|
maps: [
|
||||||
{
|
{
|
||||||
scenario: navigationScenarios.CLICKED_BACK,
|
scenario: navigationScenarios.CLICKED_BACK_INSHOP,
|
||||||
destinationIssPageValue: issPageValues.SERVICE_PACKAGES
|
destinationIssPageValue: issPageValues.SERVICE_PACKAGES
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
scenario: navigationScenarios.CLICKED_BACK_MOBILE,
|
||||||
|
destinationIssPageValue: issPageValues.CONTACT_DETAILS
|
||||||
|
},
|
||||||
{
|
{
|
||||||
scenario: navigationScenarios.CLICKED_FORWARD,
|
scenario: navigationScenarios.CLICKED_FORWARD,
|
||||||
destinationIssPageValue: issPageValues.ORDER_CONFIRMATION
|
destinationIssPageValue: issPageValues.ORDER_CONFIRMATION
|
||||||
|
|
@ -740,7 +768,7 @@ const routingTable = () => [
|
||||||
destinationIssPageValue: issPageValues.TPA_SUBMIT
|
destinationIssPageValue: issPageValues.TPA_SUBMIT
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
scenario: navigationScenarios.CLICKED_DO_NOT_SEE_MY_SHOP_LINK,
|
scenario: navigationScenarios.CLICKED_NEED_HELP,
|
||||||
destinationIssPageValue: issPageValues.BAILOUT_PAGE
|
destinationIssPageValue: issPageValues.BAILOUT_PAGE
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -191,9 +191,6 @@ export const getDefaultState = () => ({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
contactInfo: {
|
contactInfo: {
|
||||||
firstName: null,
|
|
||||||
lastName: null,
|
|
||||||
emailAddress: null,
|
|
||||||
homePhone: null,
|
homePhone: null,
|
||||||
alternativePhone: null,
|
alternativePhone: null,
|
||||||
servicePhone: null,
|
servicePhone: null,
|
||||||
|
|
@ -358,9 +355,9 @@ export const useMainStore = defineStore({
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
contactInfo: (s) => ({
|
contactInfo: (s) => ({
|
||||||
firstName: s.order.contactInfo.firstName ?? s.order.customer.firstName,
|
firstName: s.order.customer.firstName,
|
||||||
lastName: s.order.contactInfo.lastName ?? s.order.customer.lastName,
|
lastName: s.order.customer.lastName,
|
||||||
emailAddress: s.order.contactInfo.emailAddress ?? s.order.customer.emailAddress,
|
emailAddress: s.order.customer.emailAddress,
|
||||||
homePhone: s.order.contactInfo.homePhone,
|
homePhone: s.order.contactInfo.homePhone,
|
||||||
alternativePhone: s.order.contactInfo.alternativePhone,
|
alternativePhone: s.order.contactInfo.alternativePhone,
|
||||||
servicePhone: s.order.contactInfo.servicePhone,
|
servicePhone: s.order.contactInfo.servicePhone,
|
||||||
|
|
@ -1472,9 +1469,9 @@ export const useMainStore = defineStore({
|
||||||
state: customer.address?.state,
|
state: customer.address?.state,
|
||||||
zipCode: customer.address?.zipCode?.toString()
|
zipCode: customer.address?.zipCode?.toString()
|
||||||
},
|
},
|
||||||
emailAddress: contactInfo.emailAddress || customer.emailAddress,
|
emailAddress: customer.emailAddress,
|
||||||
firstName: contactInfo.firstName || customer.firstName,
|
firstName: customer.firstName,
|
||||||
lastName: contactInfo.lastName || customer.lastName,
|
lastName: customer.lastName,
|
||||||
homePhone: contactInfo.extension && contactInfo.homePhone ? contactInfo.homePhone + contactInfo.extension : contactInfo.homePhone,
|
homePhone: contactInfo.extension && contactInfo.homePhone ? contactInfo.homePhone + contactInfo.extension : contactInfo.homePhone,
|
||||||
servicePhone: contactInfo.servicePhone,
|
servicePhone: contactInfo.servicePhone,
|
||||||
alternativePhone: contactInfo.alternativePhone,
|
alternativePhone: contactInfo.alternativePhone,
|
||||||
|
|
@ -1679,11 +1676,10 @@ export const useMainStore = defineStore({
|
||||||
order.customer.address.city = data.customer?.address?.city;
|
order.customer.address.city = data.customer?.address?.city;
|
||||||
order.customer.address.state = data.customer?.address?.state;
|
order.customer.address.state = data.customer?.address?.state;
|
||||||
order.customer.address.zipCode = data.customer?.address?.zipCode;
|
order.customer.address.zipCode = data.customer?.address?.zipCode;
|
||||||
order.customer.emailAddress = data.customer?.emailAddress;
|
order.customer.firstName = data?.customer?.firstName;
|
||||||
|
order.customer.lastName = data?.customer?.lastName;
|
||||||
|
order.customer.emailAddress = data?.customer?.emailAddress;
|
||||||
|
|
||||||
order.contactInfo.firstName = data?.customer?.firstName;
|
|
||||||
order.contactInfo.lastName = data?.customer?.lastName;
|
|
||||||
order.contactInfo.emailAddress = data?.customer?.emailAddress;
|
|
||||||
order.contactInfo.extension = data?.customer?.homePhone?.slice(10);
|
order.contactInfo.extension = data?.customer?.homePhone?.slice(10);
|
||||||
order.contactInfo.homePhone = data?.customer?.homePhone?.slice(0, 10);
|
order.contactInfo.homePhone = data?.customer?.homePhone?.slice(0, 10);
|
||||||
order.contactInfo.servicePhone = data?.customer?.servicePhone;
|
order.contactInfo.servicePhone = data?.customer?.servicePhone;
|
||||||
|
|
@ -1829,27 +1825,29 @@ export const useMainStore = defineStore({
|
||||||
this.order.vehicle.registration.lastName = registrationInfo?.lastName;
|
this.order.vehicle.registration.lastName = registrationInfo?.lastName;
|
||||||
},
|
},
|
||||||
updateServiceLocation(serviceLocationInfo) {
|
updateServiceLocation(serviceLocationInfo) {
|
||||||
this.order.serviceLocation.address = serviceLocationInfo.address;
|
this.order.serviceLocation.address = serviceLocationInfo.address ?? this.order.serviceLocation.address;
|
||||||
this.order.serviceLocation.address2 = serviceLocationInfo.address2;
|
this.order.serviceLocation.address2 = serviceLocationInfo.address2 ?? this.order.serviceLocation.address2;
|
||||||
this.order.serviceLocation.city = serviceLocationInfo.city;
|
this.order.serviceLocation.city = serviceLocationInfo.city ?? this.order.serviceLocation.city;
|
||||||
this.order.serviceLocation.state = serviceLocationInfo.state;
|
this.order.serviceLocation.state = serviceLocationInfo.state ?? this.order.serviceLocation.state;
|
||||||
this.order.serviceLocation.zipCode = serviceLocationInfo.zipCode;
|
this.order.serviceLocation.zipCode = serviceLocationInfo.zipCode ?? this.order.serviceLocation.zipCode;
|
||||||
this.order.serviceLocation.zipCodeCtu = serviceLocationInfo.zipCodeCtu;
|
this.order.serviceLocation.zipCodeCtu = serviceLocationInfo.zipCodeCtu ?? this.order.serviceLocation.zipCodeCtu;
|
||||||
this.order.serviceLocation.appointmentType = serviceLocationInfo.appointmentType;
|
this.order.serviceLocation.appointmentType = serviceLocationInfo.appointmentType ?? this.order.serviceLocation.appointmentType;
|
||||||
this.order.serviceLocation.isVehicleProtected = serviceLocationInfo.isVehicleProtected;
|
this.order.serviceLocation.isVehicleProtected = serviceLocationInfo.isVehicleProtected ?? this.order.serviceLocation.isVehicleProtected;
|
||||||
|
|
||||||
this.order.serviceLocation.provider = {
|
if (serviceLocationInfo.provider) {
|
||||||
providerNumber: serviceLocationInfo.provider?.providerNumber,
|
this.order.serviceLocation.provider = {
|
||||||
address: {
|
providerNumber: serviceLocationInfo.provider?.providerNumber,
|
||||||
streetAddress: serviceLocationInfo.provider?.address?.streetAddress,
|
address: {
|
||||||
city: serviceLocationInfo.provider?.address?.city,
|
streetAddress: serviceLocationInfo.provider?.address?.streetAddress,
|
||||||
state: serviceLocationInfo.provider?.address?.state,
|
city: serviceLocationInfo.provider?.address?.city,
|
||||||
zipCode: serviceLocationInfo.provider?.address?.zipCode,
|
state: serviceLocationInfo.provider?.address?.state,
|
||||||
zipCodeCtu: serviceLocationInfo.provider?.address?.zipCodeCtu
|
zipCode: serviceLocationInfo.provider?.address?.zipCode,
|
||||||
},
|
zipCodeCtu: serviceLocationInfo.provider?.address?.zipCodeCtu
|
||||||
companyName: serviceLocationInfo.provider?.companyName,
|
},
|
||||||
phoneNumber: serviceLocationInfo.provider?.phoneNumber
|
companyName: serviceLocationInfo.provider?.companyName,
|
||||||
};
|
phoneNumber: serviceLocationInfo.provider?.phoneNumber
|
||||||
|
};
|
||||||
|
}
|
||||||
this.order.serviceLocation.searchFilter = serviceLocationInfo.searchFilter;
|
this.order.serviceLocation.searchFilter = serviceLocationInfo.searchFilter;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -2122,9 +2120,6 @@ export const useMainStore = defineStore({
|
||||||
},
|
},
|
||||||
|
|
||||||
resetContactInfo() {
|
resetContactInfo() {
|
||||||
this.order.contactInfo.firstName = null;
|
|
||||||
this.order.contactInfo.lastName = null;
|
|
||||||
this.order.contactInfo.emailAddress = null;
|
|
||||||
this.order.contactInfo.homePhone = null;
|
this.order.contactInfo.homePhone = null;
|
||||||
this.order.contactInfo.alternativePhone = null;
|
this.order.contactInfo.alternativePhone = null;
|
||||||
this.order.contactInfo.servicePhone = null;
|
this.order.contactInfo.servicePhone = null;
|
||||||
|
|
@ -2608,9 +2603,10 @@ export const useMainStore = defineStore({
|
||||||
},
|
},
|
||||||
|
|
||||||
updateContactInfo(contactInfo) {
|
updateContactInfo(contactInfo) {
|
||||||
this.order.contactInfo.firstName = contactInfo?.firstName ?? '';
|
this.order.customer.firstName = contactInfo?.firstName ?? this.order.customer.firstName;
|
||||||
this.order.contactInfo.lastName = contactInfo?.lastName ?? '';
|
this.order.customer.lastName = contactInfo?.lastName ?? this.order.customer.lastName;
|
||||||
this.order.contactInfo.emailAddress = contactInfo?.emailAddress ?? '';
|
this.order.customer.emailAddress = contactInfo?.emailAddress ?? this.order.customer.emailAddress;
|
||||||
|
|
||||||
this.order.contactInfo.requestTextUpdates = contactInfo?.requestTextUpdates ?? false;
|
this.order.contactInfo.requestTextUpdates = contactInfo?.requestTextUpdates ?? false;
|
||||||
this.order.contactInfo.notesForTechnician = contactInfo?.notesForTechnician ?? '';
|
this.order.contactInfo.notesForTechnician = contactInfo?.notesForTechnician ?? '';
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -487,7 +487,7 @@ describe('Store', () => {
|
||||||
// Arrange
|
// Arrange
|
||||||
const firstName = getRandomString(4, 10);
|
const firstName = getRandomString(4, 10);
|
||||||
const lastName = getRandomString(5, 15);
|
const lastName = getRandomString(5, 15);
|
||||||
const emailAddress = false;
|
const emailAddress = getRandomString(5, 15);
|
||||||
const requestTextUpdates = getRandomBoolean();
|
const requestTextUpdates = getRandomBoolean();
|
||||||
const notesForTechnician = getRandomString(50, 150);
|
const notesForTechnician = getRandomString(50, 150);
|
||||||
|
|
||||||
|
|
@ -526,14 +526,14 @@ describe('Store', () => {
|
||||||
expect(store.contactInfo.alternativePhone).toEqual(altPhone);
|
expect(store.contactInfo.alternativePhone).toEqual(altPhone);
|
||||||
expect(store.contactInfo.extension).toEqual(extension);
|
expect(store.contactInfo.extension).toEqual(extension);
|
||||||
});
|
});
|
||||||
it('All null values => contact info set in store to all nulls', () => {
|
it('All null values => contact info set in store to all null/default', () => {
|
||||||
// Act
|
// Act
|
||||||
store.updateContactInfo({});
|
store.updateContactInfo({});
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
expect(store.contactInfo.firstName).toEqual('');
|
expect(store.contactInfo.firstName).toEqual(null);
|
||||||
expect(store.contactInfo.lastName).toEqual('');
|
expect(store.contactInfo.lastName).toEqual(null);
|
||||||
expect(store.contactInfo.emailAddress).toEqual('');
|
expect(store.contactInfo.emailAddress).toEqual(null);
|
||||||
expect(store.contactInfo.requestTextUpdates).toEqual(false);
|
expect(store.contactInfo.requestTextUpdates).toEqual(false);
|
||||||
expect(store.contactInfo.notesForTechnician).toEqual('');
|
expect(store.contactInfo.notesForTechnician).toEqual('');
|
||||||
});
|
});
|
||||||
|
|
@ -755,13 +755,13 @@ describe('Store', () => {
|
||||||
const contactServicePhone = getRandomString(6, 6);
|
const contactServicePhone = getRandomString(6, 6);
|
||||||
const contactAlternativePhone = getRandomString(6, 6);
|
const contactAlternativePhone = getRandomString(6, 6);
|
||||||
const requestTextUpdates = getRandomBoolean();
|
const requestTextUpdates = getRandomBoolean();
|
||||||
store.order.contactInfo.firstName = contactFirstName;
|
|
||||||
store.order.contactInfo.lastName = contactLastName;
|
|
||||||
store.order.contactInfo.emailAddress = contactEmail;
|
|
||||||
store.order.contactInfo.homePhone = contactHomePhone;
|
store.order.contactInfo.homePhone = contactHomePhone;
|
||||||
store.order.contactInfo.servicePhone = contactServicePhone;
|
store.order.contactInfo.servicePhone = contactServicePhone;
|
||||||
store.order.contactInfo.alternativePhone = contactAlternativePhone;
|
store.order.contactInfo.alternativePhone = contactAlternativePhone;
|
||||||
store.order.contactInfo.requestTextUpdates = requestTextUpdates;
|
store.order.contactInfo.requestTextUpdates = requestTextUpdates;
|
||||||
|
store.order.customer.firstName = contactFirstName;
|
||||||
|
store.order.customer.lastName = contactLastName;
|
||||||
|
store.order.customer.emailAddress = contactEmail;
|
||||||
store.order.customer.address.streetAddress = streetAddress;
|
store.order.customer.address.streetAddress = streetAddress;
|
||||||
store.order.customer.address.streetAddress2 = streetAddress2;
|
store.order.customer.address.streetAddress2 = streetAddress2;
|
||||||
store.order.customer.address.city = city;
|
store.order.customer.address.city = city;
|
||||||
|
|
|
||||||
|
|
@ -31,41 +31,44 @@
|
||||||
<slot name="headline-line-two"></slot>
|
<slot name="headline-line-two"></slot>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<button
|
<div class="alert-icon-container">
|
||||||
v-if="isCollapsible"
|
<button
|
||||||
class="btn-collapse"
|
v-if="isCollapsible"
|
||||||
type="button"
|
class="btn-collapse"
|
||||||
@click="toggleCollapse">
|
type="button"
|
||||||
<svg
|
@click="toggleCollapse">
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
<svg
|
||||||
width="15"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
height="9"
|
width="15"
|
||||||
viewBox="0 0 15 9"
|
height="9"
|
||||||
class="btn-collapse-icon"
|
viewBox="0 0 15 9"
|
||||||
:class="{ 'rotated': !collapsed }">
|
class="btn-collapse-icon"
|
||||||
<path
|
:class="{ 'rotated': !collapsed }">
|
||||||
fill-rule="nonzero"
|
<path
|
||||||
d="M7.5 0a.806.806 0 0 0-.593.265L.246 7.455a.957.957 0 0 0 0 1.28.796.796 0 0 0
|
fill-rule="nonzero"
|
||||||
1.185 0l6.07-6.55 6.068 6.55a.796.796 0 0 0 1.186 0 .957.957 0 0 0 0-1.28L8.093.265A.806.806
|
d="M7.5 0a.806.806 0 0 0-.593.265L.246 7.455a.957.957 0 0 0 0 1.28.796.796 0 0 0
|
||||||
0 0 0 7.5 0" />
|
1.185 0l6.07-6.55 6.068 6.55a.796.796 0 0 0 1.186 0 .957.957 0 0 0 0-1.28L8.093.265A.806.806
|
||||||
</svg>
|
0 0 0 7.5 0" />
|
||||||
</button>
|
</svg>
|
||||||
<button
|
</button>
|
||||||
v-if="isDismissible"
|
<button
|
||||||
type="button"
|
v-if="isDismissible"
|
||||||
class="btn-close p-2"
|
type="button"
|
||||||
data-bs-dismiss="alert"
|
class="btn-dismiss"
|
||||||
aria-label="Close">
|
data-bs-dismiss="alert"
|
||||||
<svg
|
aria-label="Close">
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
<svg
|
||||||
viewBox="0 0 23.7 23.7"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
xml:space="preserve">
|
viewBox="0 0 23.7 23.7"
|
||||||
<path
|
class="btn-dismiss-icon"
|
||||||
d="m23.24 2.7-9.15 9.15L23.24 21a1.581 1.581 0 0 1-1.12 2.7c-.42 0-.82-.16-1.12-.46l-9.15-9.15-9.15 9.15c-.3.3-.7.46-1.12.46A1.581
|
xml:space="preserve">
|
||||||
1.581 0 0 1 .46 21l8.47-8.47.68-.68L.46 2.7c-.62-.62-.62-1.62 0-2.24.62-.62 1.62-.62 2.24 0l8.47 8.47.68.68L21
|
<path
|
||||||
.46a1.57 1.57 0 0 1 2.23 0c.63.62.63 1.62.01 2.24z" />
|
d="m23.24 2.7-9.15 9.15L23.24 21a1.581 1.581 0 0 1-1.12 2.7c-.42 0-.82-.16-1.12-.46l-9.15-9.15-9.15 9.15c-.3.3-.7.46-1.12.46A1.581
|
||||||
</svg>
|
1.581 0 0 1 .46 21l8.47-8.47.68-.68L.46 2.7c-.62-.62-.62-1.62 0-2.24.62-.62 1.62-.62 2.24 0l8.47 8.47.68.68L21
|
||||||
</button>
|
.46a1.57 1.57 0 0 1 2.23 0c.63.62.63 1.62.01 2.24z" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-show="alertCopy"
|
v-show="alertCopy"
|
||||||
|
|
@ -297,18 +300,22 @@ export default {
|
||||||
transform: none;
|
transform: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.btn-dismiss {
|
||||||
|
display: flex;
|
||||||
|
border: none;
|
||||||
|
background: none;
|
||||||
|
min-width: 1rem;
|
||||||
|
max-height: 1rem;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.btn-dismiss-icon {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
a {
|
a {
|
||||||
font-weight: $font-weight-normal;
|
font-weight: $font-weight-normal;
|
||||||
}
|
}
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
.btn-close {
|
|
||||||
background: none;
|
|
||||||
opacity: 1;
|
|
||||||
width: 0.75rem;
|
|
||||||
height: 0.75rem;
|
|
||||||
top: 2px;
|
|
||||||
right: 2px;
|
|
||||||
}
|
|
||||||
.alert-body {
|
.alert-body {
|
||||||
margin: 0 1rem;
|
margin: 0 1rem;
|
||||||
padding: .5rem 1rem .75rem 1rem;
|
padding: .5rem 1rem .75rem 1rem;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue