adp-web-components 0.3.20 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/branch-date-dropdown_17.cjs.entry.js +40 -39
- package/dist/cjs/dead-stock-lookup_3.cjs.entry.js +9 -9
- package/dist/cjs/flexible-container.cjs.entry.js +5 -23
- package/dist/cjs/form-checkbox.cjs.entry.js +2 -2
- package/dist/cjs/form-date-picker.cjs.entry.js +5 -5
- package/dist/cjs/form-input_7.cjs.entry.js +17 -17
- package/dist/cjs/form-switch.cjs.entry.js +2 -2
- package/dist/cjs/form-time-picker.cjs.entry.js +6 -6
- package/dist/cjs/{functions-BAUJUMt-.js → functions-gb1i8Hkl.js} +1 -1
- package/dist/cjs/general-form.cjs.entry.js +4 -4
- package/dist/cjs/general-inquiry-form.cjs.entry.js +4 -4
- package/dist/cjs/{get-local-language-DI_UK6D5.js → get-local-language-CZeC0BN9.js} +4 -4
- package/dist/cjs/{get-mock-files-B1tNGb9m.js → get-mock-files-NMHm1Vgn.js} +1 -1
- package/dist/cjs/information-table.cjs.entry.js +24 -12
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/loading-spinner.cjs.entry.js +2 -2
- package/dist/cjs/manufacturer-part-lookup.cjs.entry.js +3 -3
- package/dist/cjs/parents-with-tag-CV2Y9Chq.js +26 -0
- package/dist/cjs/part-lookup.cjs.entry.js +2 -2
- package/dist/cjs/reveal-below-CyYolTYX.js +127 -0
- package/dist/cjs/service-booking-form.cjs.entry.js +4 -4
- package/dist/cjs/shift-accordion.cjs.entry.js +1 -1
- package/dist/cjs/shift-checkbox.cjs.entry.js +2 -2
- package/dist/cjs/shift-components.cjs.js +1 -1
- package/dist/cjs/shift-slider.cjs.entry.js +2 -2
- package/dist/cjs/shift-switch.cjs.entry.js +2 -2
- package/dist/cjs/shift-tab-content.cjs.entry.js +2 -2
- package/dist/cjs/shift-tabs_2.cjs.entry.js +10 -10
- package/dist/cjs/ssc-lookup-form.cjs.entry.js +4 -4
- package/dist/cjs/test-drive-form.cjs.entry.js +4 -4
- package/dist/cjs/{type-BHyLb1S8.js → type-CTsARyVi.js} +63 -18
- package/dist/cjs/vehicle-accessories_8.cjs.entry.js +819 -204
- package/dist/cjs/vehicle-lookup.cjs.entry.js +56 -40
- package/dist/cjs/vehicle-quotation-form.cjs.entry.js +4 -4
- package/dist/collection/collection-manifest.json +1 -1
- package/dist/collection/components/components/empty.css +1 -1
- package/dist/collection/components/components/flexible-container.css +1 -1
- package/dist/collection/components/components/flexible-container.js +2 -2
- package/dist/collection/components/components/information-table.css +1 -1
- package/dist/collection/components/components/information-table.js +21 -8
- package/dist/collection/components/components/loading-spinner.css +1 -1
- package/dist/collection/components/components/loading-spinner.js +1 -1
- package/dist/collection/components/components/shift-accordion.js +1 -1
- package/dist/collection/components/components/shift-checkbox.js +1 -1
- package/dist/collection/components/components/shift-portal.css +1 -1
- package/dist/collection/components/components/shift-select-dropdown.css +1 -1
- package/dist/collection/components/components/shift-select-dropdown.js +2 -2
- package/dist/collection/components/components/shift-select.css +1 -1
- package/dist/collection/components/components/shift-select.js +3 -3
- package/dist/collection/components/components/shift-slider.css +1 -1
- package/dist/collection/components/components/shift-slider.js +1 -1
- package/dist/collection/components/components/shift-switch.js +1 -1
- package/dist/collection/components/components/shift-tab-content.css +1 -1
- package/dist/collection/components/components/shift-tab-content.js +1 -1
- package/dist/collection/components/components/shift-tabs.css +1 -1
- package/dist/collection/components/components/shift-tabs.js +2 -2
- package/dist/collection/components/form-elements/branch-date-dropdown.js +2 -2
- package/dist/collection/components/form-elements/branch-date-picker.js +2 -2
- package/dist/collection/components/form-elements/branch-slot-dropdown.css +1 -1
- package/dist/collection/components/form-elements/branch-slot-dropdown.js +1 -1
- package/dist/collection/components/form-elements/branch-slot-picker.js +2 -2
- package/dist/collection/components/form-elements/form-checkbox.js +1 -1
- package/dist/collection/components/form-elements/form-date-picker-legacy.js +4 -4
- package/dist/collection/components/form-elements/form-dialog.css +1 -1
- package/dist/collection/components/form-elements/form-dialog.js +1 -1
- package/dist/collection/components/form-elements/form-file.js +2 -2
- package/dist/collection/components/form-elements/form-input.js +2 -2
- package/dist/collection/components/form-elements/form-inputs.css +1 -1
- package/dist/collection/components/form-elements/form-picker-input.js +2 -2
- package/dist/collection/components/form-elements/form-shadow-input.js +1 -1
- package/dist/collection/components/form-elements/form-stepper-control.js +2 -2
- package/dist/collection/components/form-elements/form-stepper-submit.js +2 -2
- package/dist/collection/components/form-elements/form-stepper.js +1 -1
- package/dist/collection/components/form-elements/form-structure-error.js +1 -1
- package/dist/collection/components/form-elements/form-structure.js +3 -2
- package/dist/collection/components/form-elements/form-submit.js +2 -2
- package/dist/collection/components/form-elements/form-switch.js +1 -1
- package/dist/collection/components/form-elements/form-text-area.js +2 -2
- package/dist/collection/components/form-elements/form-time-picker-legacy.js +5 -5
- package/dist/collection/components/form-elements/form-vin-input.js +2 -2
- package/dist/collection/components/forms/general-form.js +2 -2
- package/dist/collection/components/forms/general-inquiry.js +2 -2
- package/dist/collection/components/forms/service-booking.js +2 -2
- package/dist/collection/components/forms/ssc-lookup.js +2 -2
- package/dist/collection/components/forms/test-drive.js +2 -2
- package/dist/collection/components/forms/vehicle-quotation.js +2 -2
- package/dist/collection/components/part-lookup/dead-stock-lookup.css +1 -1
- package/dist/collection/components/part-lookup/dead-stock-lookup.js +2 -2
- package/dist/collection/components/part-lookup/distributor-lookup.css +1 -1
- package/dist/collection/components/part-lookup/distributor-lookup.js +2 -2
- package/dist/collection/components/part-lookup/manufacturer-lookup.css +1 -1
- package/dist/collection/components/part-lookup/manufacturer-part-lookup.css +1 -1
- package/dist/collection/components/part-lookup/manufacturer-part-lookup.js +1 -1
- package/dist/collection/components/part-lookup/part-lookup.css +1 -1
- package/dist/collection/components/vehicle-lookup/components/CoverageTimeline.js +5 -8
- package/dist/collection/components/vehicle-lookup/components/SscCampaigns.js +236 -0
- package/dist/collection/components/vehicle-lookup/components/glyphs.js +19 -0
- package/dist/collection/components/vehicle-lookup/vehicle-accessories.css +1 -1
- package/dist/collection/components/vehicle-lookup/vehicle-accessories.js +3 -3
- package/dist/collection/components/vehicle-lookup/vehicle-claimable-items.css +1 -1
- package/dist/collection/components/vehicle-lookup/vehicle-claimable-items.js +61 -9
- package/dist/collection/components/vehicle-lookup/vehicle-item-claim-form.css +1 -1
- package/dist/collection/components/vehicle-lookup/vehicle-item-claim-form.js +6 -6
- package/dist/collection/components/vehicle-lookup/vehicle-lookup.css +1 -1
- package/dist/collection/components/vehicle-lookup/vehicle-lookup.js +99 -59
- package/dist/collection/components/vehicle-lookup/vehicle-paint-thickness.css +1 -1
- package/dist/collection/components/vehicle-lookup/vehicle-paint-thickness.js +1 -1
- package/dist/collection/components/vehicle-lookup/vehicle-sale-information.css +1 -1
- package/dist/collection/components/vehicle-lookup/vehicle-sale-information.js +3 -3
- package/dist/collection/components/vehicle-lookup/vehicle-service-history.css +1 -1
- package/dist/collection/components/vehicle-lookup/vehicle-service-history.js +2 -2
- package/dist/collection/components/vehicle-lookup/vehicle-specification.css +1 -1
- package/dist/collection/components/vehicle-lookup/vehicle-specification.js +2 -2
- package/dist/collection/components/vehicle-lookup/vehicle-ssc.css +1 -0
- package/dist/collection/components/vehicle-lookup/{vehicle-warranty-details.js → vehicle-ssc.js} +583 -189
- package/dist/collection/components/vehicle-lookup/vehicle-warranty-timeline.css +1 -1
- package/dist/collection/components/vehicle-lookup/vehicle-warranty-timeline.js +5 -6
- package/dist/collection/components/vin-extractor/vin-extractor.js +1 -1
- package/dist/collection/features/vehicle-lookup-component/index.js +1 -0
- package/dist/collection/features/vehicle-lookup-component/request-headers.js +42 -0
- package/dist/collection/features/vehicle-lookup-component/vehicle-lookup-api-integration.js +9 -7
- package/dist/collection/global/lib/flexible-parents.js +46 -0
- package/dist/collection/global/lib/reveal-below.js +118 -0
- package/dist/collection/global/types/generated/vehicle-lookup/ssc-repair-trace-dto.js +1 -0
- package/dist/collection/global/types/generated/vehicle-lookup/ssc-repair-trace-labor-code-dto.js +1 -0
- package/dist/collection/global/types/generated/vehicle-lookup/ssc-repair-trace-labor-line-dto.js +1 -0
- package/dist/collection/global/types/generated/vehicle-lookup/ssc-repair-trace-warranty-claim-dto.js +1 -0
- package/dist/collection/locale-mapper.js +3 -3
- package/dist/collection/locales/vehicleLookup/ssc/type.js +70 -0
- package/dist/collection/locales/vehicleLookup/wrapper-type.js +2 -2
- package/dist/collection/templates/harness.js +3 -1
- package/dist/components/branch-date-dropdown.js +1 -1
- package/dist/components/branch-date-picker.js +1 -1
- package/dist/components/branch-slot-dropdown.js +1 -1
- package/dist/components/branch-slot-picker.js +1 -1
- package/dist/components/dead-stock-lookup.js +1 -1
- package/dist/components/distributor-lookup.js +1 -1
- package/dist/components/flexible-container.js +1 -1
- package/dist/components/form-checkbox.js +1 -1
- package/dist/components/form-date-picker.js +1 -1
- package/dist/components/form-dialog.js +1 -1
- package/dist/components/form-file.js +1 -1
- package/dist/components/form-input-preview.js +1 -1
- package/dist/components/form-input.js +1 -1
- package/dist/components/form-phone-number.js +1 -1
- package/dist/components/form-picker-input.js +1 -1
- package/dist/components/form-select.js +1 -1
- package/dist/components/form-shadow-input.js +1 -1
- package/dist/components/form-stepper-control.js +1 -1
- package/dist/components/form-stepper-submit.js +1 -1
- package/dist/components/form-stepper.js +1 -1
- package/dist/components/form-structure-error.js +1 -1
- package/dist/components/form-structure.js +1 -1
- package/dist/components/form-submit.js +1 -1
- package/dist/components/form-switch.js +1 -1
- package/dist/components/form-text-area.js +1 -1
- package/dist/components/form-time-picker.js +1 -1
- package/dist/components/form-vin-input.js +1 -1
- package/dist/components/general-form.js +1 -1
- package/dist/components/general-inquiry-form.js +1 -1
- package/dist/components/information-table.js +1 -1
- package/dist/components/loading-spinner.js +1 -1
- package/dist/components/manufacturer-lookup.js +1 -1
- package/dist/components/manufacturer-part-lookup.js +1 -1
- package/dist/components/{p-CsU_c7eX.js → p-AkWKeTFc.js} +1 -1
- package/dist/components/{p-CMAmzdM7.js → p-B2Rwfoy0.js} +1 -1
- package/dist/components/p-B4nj03om.js +5 -0
- package/dist/components/p-BAkLdLKZ.js +5 -0
- package/dist/components/p-BDCBfHZQ.js +5 -0
- package/dist/components/{p-DQ0uTCi2.js → p-BDOUh9fr.js} +1 -1
- package/dist/components/p-BGf2deKN.js +5 -0
- package/dist/components/{p-5OD_mwiD.js → p-BNmsN10T.js} +1 -1
- package/dist/components/p-BOaqSzZZ.js +5 -0
- package/dist/components/p-B_1NtFJh.js +5 -0
- package/dist/components/{p-Cpjvk1pk.js → p-BhekdMkM.js} +1 -1
- package/dist/components/p-BpZlI-gl.js +5 -0
- package/dist/components/p-BtipOZUG.js +5 -0
- package/dist/components/{p-KbiYvxzP.js → p-BvM3siIc.js} +1 -1
- package/dist/components/{p-rQ3Z9EnS.js → p-BwoBk7eI.js} +1 -1
- package/dist/components/{p-SIS25ChD.js → p-BxGye2qd.js} +1 -1
- package/dist/components/{p-D42YuMNZ.js → p-BySGDlQi.js} +1 -1
- package/dist/components/{p-BvLVCp-j.js → p-ByrX91PC.js} +1 -1
- package/dist/components/p-C9uBduBY.js +5 -0
- package/dist/components/{p-DnspXuVN.js → p-CETvww16.js} +1 -1
- package/dist/components/{p-CJtTHErI.js → p-CT-MbmyW.js} +1 -1
- package/dist/components/p-CUO3vXQr.js +5 -0
- package/dist/components/{p-BPXRokES.js → p-CbRoCi89.js} +1 -1
- package/dist/components/{p-ikaUQvOO.js → p-CebvOd8T.js} +1 -1
- package/dist/components/{p-68bjv9gT.js → p-Cy8khSKP.js} +1 -1
- package/dist/components/{p-BpB_86n0.js → p-D4VK-Fv7.js} +1 -1
- package/dist/components/p-D4aXUm2Y.js +5 -0
- package/dist/components/{p-Wgb4y0H3.js → p-D8w2fZLP.js} +1 -1
- package/dist/components/p-DCO6piZ9.js +5 -0
- package/dist/components/{p-B1xVBTqj.js → p-DConDqrK.js} +1 -1
- package/dist/components/{p-BsnGFZeT.js → p-DDTSLfBG.js} +1 -1
- package/dist/components/{p-C3KLOUbk.js → p-DJDhhX5A.js} +1 -1
- package/dist/components/p-DKWqzBVM.js +5 -0
- package/dist/components/{p-BI5NL1Rh.js → p-DOIpj5PH.js} +1 -1
- package/dist/components/{p-BWlX-Nz-.js → p-DVkAlTjC.js} +1 -1
- package/dist/components/p-D_uU2Pi-.js +5 -0
- package/dist/components/{p-BULuujHY.js → p-DfVskL_i.js} +1 -1
- package/dist/components/p-DkCqJ072.js +5 -0
- package/dist/components/p-DpuHkgw0.js +5 -0
- package/dist/components/{p-Ce2mazYo.js → p-DrF7UQxE.js} +1 -1
- package/dist/components/{p-DCpRGVqe.js → p-DxRQkoRz.js} +1 -1
- package/dist/components/{p-BcWJAP8j.js → p-Imck426q.js} +1 -1
- package/dist/components/{p-bCeQwUKM.js → p-UFwS4oV2.js} +1 -1
- package/dist/components/p-WIpbRULc.js +5 -0
- package/dist/components/p-XFwQkeZH.js +5 -0
- package/dist/components/p-Ype8FNjy.js +5 -0
- package/dist/components/{p-B0_5_VvS.js → p-a4ooD0o_.js} +1 -1
- package/dist/components/{p-DTmI_Yx0.js → p-bVbnoz7C.js} +1 -1
- package/dist/components/{p-OY4Ixaeq.js → p-d1WgLP9O.js} +1 -1
- package/dist/components/{p-Bc5HIbcj.js → p-vlA3PJQv.js} +1 -1
- package/dist/components/{p-BpHkd1L9.js → p-vuYBsCyI.js} +1 -1
- package/dist/components/part-lookup.js +1 -1
- package/dist/components/service-booking-form.js +1 -1
- package/dist/components/shift-accordion.js +1 -1
- package/dist/components/shift-checkbox.js +1 -1
- package/dist/components/shift-portal.js +1 -1
- package/dist/components/shift-select-dropdown.js +1 -1
- package/dist/components/shift-select.js +1 -1
- package/dist/components/shift-slider.js +1 -1
- package/dist/components/shift-switch.js +1 -1
- package/dist/components/shift-tab-content.js +1 -1
- package/dist/components/shift-tabs.js +1 -1
- package/dist/components/ssc-lookup-form.js +1 -1
- package/dist/components/test-drive-form.js +1 -1
- package/dist/components/vehicle-accessories.js +1 -1
- package/dist/components/vehicle-claimable-items.js +1 -1
- package/dist/components/vehicle-item-claim-form.js +1 -1
- package/dist/components/vehicle-lookup.js +1 -1
- package/dist/components/vehicle-paint-thickness.js +1 -1
- package/dist/components/vehicle-quotation-form.js +1 -1
- package/dist/components/vehicle-sale-information.js +1 -1
- package/dist/components/vehicle-service-history.js +1 -1
- package/dist/components/vehicle-specification.js +1 -1
- package/dist/components/vehicle-ssc.d.ts +11 -0
- package/dist/components/vehicle-ssc.js +5 -0
- package/dist/components/vehicle-warranty-timeline.js +1 -1
- package/dist/components/vin-extractor.js +1 -1
- package/dist/esm/branch-date-dropdown_17.entry.js +40 -39
- package/dist/esm/dead-stock-lookup_3.entry.js +9 -9
- package/dist/esm/flexible-container.entry.js +4 -22
- package/dist/esm/form-checkbox.entry.js +2 -2
- package/dist/esm/form-date-picker.entry.js +5 -5
- package/dist/esm/form-input_7.entry.js +17 -17
- package/dist/esm/form-switch.entry.js +2 -2
- package/dist/esm/form-time-picker.entry.js +6 -6
- package/dist/esm/{functions-DSwc1YVL.js → functions-SHZO3nZB.js} +1 -1
- package/dist/esm/general-form.entry.js +4 -4
- package/dist/esm/general-inquiry-form.entry.js +4 -4
- package/dist/esm/{get-local-language-DdSAPSCV.js → get-local-language-BLpgwBTx.js} +4 -4
- package/dist/esm/{get-mock-files-D4naDetb.js → get-mock-files-Dpb0udoz.js} +1 -1
- package/dist/esm/information-table.entry.js +22 -10
- package/dist/esm/loader.js +1 -1
- package/dist/esm/loading-spinner.entry.js +2 -2
- package/dist/esm/manufacturer-part-lookup.entry.js +3 -3
- package/dist/esm/parents-with-tag-WIpbRULc.js +24 -0
- package/dist/esm/part-lookup.entry.js +2 -2
- package/dist/esm/reveal-below-DWXRi5w3.js +124 -0
- package/dist/esm/service-booking-form.entry.js +4 -4
- package/dist/esm/shift-accordion.entry.js +1 -1
- package/dist/esm/shift-checkbox.entry.js +2 -2
- package/dist/esm/shift-components.js +1 -1
- package/dist/esm/shift-slider.entry.js +2 -2
- package/dist/esm/shift-switch.entry.js +2 -2
- package/dist/esm/shift-tab-content.entry.js +2 -2
- package/dist/esm/shift-tabs_2.entry.js +10 -10
- package/dist/esm/ssc-lookup-form.entry.js +4 -4
- package/dist/esm/test-drive-form.entry.js +4 -4
- package/dist/esm/{type-DEzFTlhs.js → type-CQsUzIOf.js} +63 -18
- package/dist/esm/vehicle-accessories_8.entry.js +819 -204
- package/dist/esm/vehicle-lookup.entry.js +56 -40
- package/dist/esm/vehicle-quotation-form.entry.js +4 -4
- package/dist/integration-manifest.json +38 -23
- package/dist/locales/vehicleLookup/ssc/ar.json +64 -0
- package/dist/locales/vehicleLookup/ssc/en.json +64 -0
- package/dist/locales/vehicleLookup/ssc/ku.json +64 -0
- package/dist/locales/vehicleLookup/ssc/ru.json +64 -0
- package/dist/locales/vehicleLookup/ssc/type.ts +68 -0
- package/dist/locales/vehicleLookup/wrapper-type.ts +2 -2
- package/dist/mocks/generated/broker-dealer/vehicle-lookup.json +40 -2
- package/dist/mocks/generated/standard-dealer/vehicle-lookup.json +61 -2
- package/dist/shift-components/{p-4b6f801a.entry.js → p-005d0a3a.entry.js} +1 -1
- package/dist/shift-components/p-0965eb41.entry.js +5 -0
- package/dist/shift-components/{p-ca0683e9.entry.js → p-164eeced.entry.js} +1 -1
- package/dist/shift-components/{p-295e445f.entry.js → p-219e589c.entry.js} +1 -1
- package/dist/shift-components/{p-b4544d10.entry.js → p-3324bdf6.entry.js} +1 -1
- package/dist/shift-components/{p-feb443ec.entry.js → p-3790e469.entry.js} +1 -1
- package/dist/shift-components/{p-df0c7ac1.entry.js → p-3895d8e5.entry.js} +1 -1
- package/dist/shift-components/p-391c55af.entry.js +5 -0
- package/dist/shift-components/{p-152057de.entry.js → p-3ba3f543.entry.js} +1 -1
- package/dist/shift-components/{p-D2Ofzg_i.js → p-48Fp2I0C.js} +1 -1
- package/dist/shift-components/p-5c28fb6d.entry.js +5 -0
- package/dist/shift-components/{p-85d43a41.entry.js → p-60232b66.entry.js} +1 -1
- package/dist/shift-components/{p-76b0ea8c.entry.js → p-82bb8960.entry.js} +1 -1
- package/dist/shift-components/{p-cbdc1c2e.entry.js → p-879faeec.entry.js} +1 -1
- package/dist/shift-components/p-90034cd8.entry.js +5 -0
- package/dist/shift-components/p-93ddc847.entry.js +5 -0
- package/dist/shift-components/p-C68bG4KE.js +5 -0
- package/dist/shift-components/{p-DDtDRGFL.js → p-DIe_G0iC.js} +1 -1
- package/dist/shift-components/p-Tjvj6pk4.js +5 -0
- package/dist/shift-components/p-WIpbRULc.js +5 -0
- package/dist/shift-components/{p-d3bbba07.entry.js → p-a4f1502c.entry.js} +1 -1
- package/dist/shift-components/{p-4cdeab63.entry.js → p-af71f000.entry.js} +1 -1
- package/dist/shift-components/p-bd8dbd1d.entry.js +5 -0
- package/dist/shift-components/{p-52530fba.entry.js → p-be19d7ff.entry.js} +1 -1
- package/dist/shift-components/{p-68e41217.entry.js → p-c40bda31.entry.js} +1 -1
- package/dist/shift-components/p-d47428d1.entry.js +5 -0
- package/dist/shift-components/p-d8844424.entry.js +5 -0
- package/dist/shift-components/p-e7986265.entry.js +5 -0
- package/dist/shift-components/p-f638970e.entry.js +5 -0
- package/dist/shift-components/{p-5e8e5ed7.entry.js → p-f93d79bc.entry.js} +1 -1
- package/dist/shift-components/{p-bfe0661c.entry.js → p-fa296247.entry.js} +1 -1
- package/dist/shift-components/p-pkYWYULB.js +5 -0
- package/dist/shift-components/shift-components.esm.js +1 -1
- package/dist/stencil-docs.json +260 -102
- package/dist/types/components/components/information-table.d.ts +3 -0
- package/dist/types/components/vehicle-lookup/components/SscCampaigns.d.ts +128 -0
- package/dist/types/components/vehicle-lookup/components/glyphs.d.ts +15 -0
- package/dist/types/components/vehicle-lookup/vehicle-claimable-items.d.ts +6 -1
- package/dist/types/components/vehicle-lookup/vehicle-lookup.d.ts +25 -6
- package/dist/types/components/vehicle-lookup/vehicle-ssc.d.ts +214 -0
- package/dist/types/components/vehicle-lookup/vehicle-warranty-timeline.d.ts +3 -4
- package/dist/types/components.d.ts +214 -43
- package/dist/types/features/vehicle-lookup-component/index.d.ts +1 -0
- package/dist/types/features/vehicle-lookup-component/interface.d.ts +8 -1
- package/dist/types/features/vehicle-lookup-component/request-headers.d.ts +40 -0
- package/dist/types/global/lib/flexible-parents.d.ts +16 -0
- package/dist/types/global/lib/reveal-below.d.ts +26 -0
- package/dist/types/global/types/generated/vehicle-lookup/ssc-dto.d.ts +3 -0
- package/dist/types/global/types/generated/vehicle-lookup/ssc-repair-trace-dto.d.ts +12 -0
- package/dist/types/global/types/generated/vehicle-lookup/ssc-repair-trace-labor-code-dto.d.ts +4 -0
- package/dist/types/global/types/generated/vehicle-lookup/ssc-repair-trace-labor-line-dto.d.ts +9 -0
- package/dist/types/global/types/generated/vehicle-lookup/ssc-repair-trace-warranty-claim-dto.d.ts +13 -0
- package/dist/types/locale-mapper.d.ts +2 -2
- package/dist/types/locales/vehicleLookup/serviceHistory/type.d.ts +2 -2
- package/dist/types/locales/vehicleLookup/ssc/type.d.ts +128 -0
- package/dist/types/locales/vehicleLookup/warrantyTimeline/type.d.ts +4 -4
- package/dist/types/locales/vehicleLookup/wrapper-type.d.ts +126 -36
- package/package.json +1 -1
- package/dist/cjs/arrow-icon-yMlETDbD.js +0 -11
- package/dist/collection/components/vehicle-lookup/components/CardsContainer.js +0 -12
- package/dist/collection/components/vehicle-lookup/components/StatusCard.js +0 -11
- package/dist/collection/components/vehicle-lookup/vehicle-warranty-details.css +0 -1
- package/dist/collection/locales/vehicleLookup/warranty/type.js +0 -25
- package/dist/components/p-38ox9qxm.js +0 -5
- package/dist/components/p-B2bD-55K.js +0 -5
- package/dist/components/p-CVpbr1tR.js +0 -5
- package/dist/components/p-CXbi5iPZ.js +0 -5
- package/dist/components/p-C_1_eN4N.js +0 -5
- package/dist/components/p-Cg6Prz81.js +0 -5
- package/dist/components/p-CqJiXtPb.js +0 -5
- package/dist/components/p-CrPyvAdX.js +0 -5
- package/dist/components/p-DCsMDWbS.js +0 -5
- package/dist/components/p-DqSdjh2n.js +0 -5
- package/dist/components/p-Dv2j7fhS.js +0 -5
- package/dist/components/p-K-OF4DG-.js +0 -5
- package/dist/components/p-X3AzJ0KD.js +0 -5
- package/dist/components/p-d3ZIPeEC.js +0 -5
- package/dist/components/p-mbVTvSJF.js +0 -5
- package/dist/components/p-rW_ExFCn.js +0 -5
- package/dist/components/p-uYkn8a0m.js +0 -5
- package/dist/components/vehicle-warranty-details.d.ts +0 -11
- package/dist/components/vehicle-warranty-details.js +0 -5
- package/dist/esm/arrow-icon-DziuNOTp.js +0 -9
- package/dist/locales/vehicleLookup/warranty/ar.json +0 -24
- package/dist/locales/vehicleLookup/warranty/en.json +0 -24
- package/dist/locales/vehicleLookup/warranty/ku.json +0 -24
- package/dist/locales/vehicleLookup/warranty/ru.json +0 -24
- package/dist/locales/vehicleLookup/warranty/type.ts +0 -23
- package/dist/shift-components/p-0b576888.entry.js +0 -5
- package/dist/shift-components/p-11ffa908.entry.js +0 -5
- package/dist/shift-components/p-198333fa.entry.js +0 -5
- package/dist/shift-components/p-247ac2db.entry.js +0 -5
- package/dist/shift-components/p-431522f2.entry.js +0 -5
- package/dist/shift-components/p-49dc6d73.entry.js +0 -5
- package/dist/shift-components/p-5ad4d072.entry.js +0 -5
- package/dist/shift-components/p-BggCINTA.js +0 -5
- package/dist/shift-components/p-D1ioFMhR.js +0 -5
- package/dist/shift-components/p-OfPuHUYc.js +0 -5
- package/dist/shift-components/p-b44b2c00.entry.js +0 -5
- package/dist/shift-components/p-c7fc8d5f.entry.js +0 -5
- package/dist/shift-components/p-f4679148.entry.js +0 -5
- package/dist/types/components/vehicle-lookup/components/CardsContainer.d.ts +0 -12
- package/dist/types/components/vehicle-lookup/components/StatusCard.d.ts +0 -14
- package/dist/types/components/vehicle-lookup/vehicle-warranty-details.d.ts +0 -77
- package/dist/types/locales/vehicleLookup/warranty/type.d.ts +0 -38
package/dist/collection/components/vehicle-lookup/{vehicle-warranty-details.js → vehicle-ssc.js}
RENAMED
|
@@ -2,35 +2,92 @@
|
|
|
2
2
|
* Built by ShiftSoftware
|
|
3
3
|
* Copyright (c)
|
|
4
4
|
*/
|
|
5
|
-
import { Host, h } from "@stencil/core";
|
|
5
|
+
import { Host, forceUpdate, h } from "@stencil/core";
|
|
6
6
|
import cn from "../../global/lib/cn";
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
7
|
+
import { revealBelow } from "../../global/lib/reveal-below";
|
|
8
|
+
import { createHeightChangeAnnouncer } from "../../global/lib/flexible-parents";
|
|
9
|
+
import sscSchema from "../../locales/vehicleLookup/ssc/type";
|
|
10
|
+
import { SscCampaigns, openDrawerKey, panelBody, sscTraceKey } from "./components/SscCampaigns";
|
|
11
11
|
import { VehicleInfoLayout } from "../../features/vehicle-info-layout/index";
|
|
12
12
|
import { smartInvokable } from "../../features/blazor-ref/index";
|
|
13
|
-
import { setVehicleLookupData, setVehicleLookupErrorState } from "../../features/vehicle-lookup-component/
|
|
13
|
+
import { resolveRequestHeaders, setVehicleLookupData, setVehicleLookupErrorState, } from "../../features/vehicle-lookup-component/index";
|
|
14
14
|
import { getLocaleLanguage, getSharedLocal, sharedLocalesSchema } from "../../features/multi-lingual/index";
|
|
15
|
-
|
|
15
|
+
const RECAPTCHA_SCRIPT_SRC = 'https://www.google.com/recaptcha/api.js?render=explicit';
|
|
16
|
+
/** The --settle token (lookup-tokens.css) when the stylesheet cannot be read, as in tests. */
|
|
17
|
+
const DEFAULT_SETTLE_MS = 320;
|
|
18
|
+
const isAbort = (error) => (error === null || error === void 0 ? void 0 : error.name) === 'AbortError';
|
|
19
|
+
/**
|
|
20
|
+
* The Special Service Campaigns (safety recalls) affecting a vehicle, and nothing else: warranty
|
|
21
|
+
* coverage lives in <vehicle-warranty-timeline>. Replaces the campaign half of the retired
|
|
22
|
+
* <vehicle-warranty-details>.
|
|
23
|
+
*
|
|
24
|
+
* A vehicle is on exactly one of two paths, and the panel must never mix them (the rule is spelled
|
|
25
|
+
* out on `panelVerdict` in ./components/SscCampaigns.tsx and in
|
|
26
|
+
* .shift/repos/adp/web-components/vehicle-lookup-invariants.md):
|
|
27
|
+
*
|
|
28
|
+
* - authorized (in the distributor's records): the campaign list is the verdict;
|
|
29
|
+
* - unauthorized: the distributor has no records, so the only verdict is the manufacturer's
|
|
30
|
+
* answer to the reCAPTCHA-gated check — a yes/no, no list. Until it arrives the panel says the
|
|
31
|
+
* vehicle is not in the records and asserts nothing else.
|
|
32
|
+
*
|
|
33
|
+
* A third state is neither: a wrapper that only counts the SSC tab's own request as a campaign
|
|
34
|
+
* check (`sscQueryString`) tells this panel through `skipLookup` that a vehicle was looked up
|
|
35
|
+
* without it. The panel then says the check was not run and offers to run it, rather than sitting
|
|
36
|
+
* blank next to a VIN as if the vehicle had no campaigns.
|
|
37
|
+
*
|
|
38
|
+
* With `show-trace`, every campaign row can open the evidence behind its repair status: the labor
|
|
39
|
+
* codes accepted for the campaign, every warranty claim on the vehicle with how it was judged, and
|
|
40
|
+
* the service-history lines that matched. The trace is fetched on first use with `?trace=ssc`, so
|
|
41
|
+
* the ordinary lookup response stays small and the host can gate the detail behind a permission.
|
|
42
|
+
*
|
|
43
|
+
* Every state change is a movement (lookup-motion.css): the outgoing content stays rendered while
|
|
44
|
+
* the body shuts over it, and the incoming content is swapped in only while the body is shut. The
|
|
45
|
+
* shared lookup helper waits a second before it asks the server, which is what guarantees the body
|
|
46
|
+
* has settled shut before a response can land.
|
|
47
|
+
*/
|
|
48
|
+
export class VehicleSsc {
|
|
16
49
|
constructor() {
|
|
17
50
|
// #region Localization
|
|
18
51
|
this.language = 'en';
|
|
19
|
-
this.locale = Object.assign({ sharedLocales: sharedLocalesSchema.getDefault() },
|
|
52
|
+
this.locale = Object.assign({ sharedLocales: sharedLocalesSchema.getDefault() }, sscSchema.getDefault());
|
|
20
53
|
// #endregion
|
|
21
54
|
// #region Vehicle info layout prop
|
|
22
55
|
this.coreOnly = false;
|
|
23
56
|
this.disableVinValidation = false;
|
|
24
57
|
this.headers = {};
|
|
25
58
|
this.queryString = '';
|
|
59
|
+
/**
|
|
60
|
+
* Appended to the campaign lookup request only, never to the trace request. A wrapper passes its
|
|
61
|
+
* `sscQueryString` — typically a lookup-logging flag — here rather than into `queryString`, so
|
|
62
|
+
* opening a campaign's evidence (a re-read of a lookup that was already logged) is never counted
|
|
63
|
+
* as another lookup. The host's endpoint must refuse to log traced requests as well.
|
|
64
|
+
*/
|
|
65
|
+
this.lookupQueryString = '';
|
|
66
|
+
/** Name of a [JSInvokable] method on the Blazor reference that answers with the current headers. */
|
|
67
|
+
this.blazorRequestHeadersProvider = '';
|
|
26
68
|
this.isError = false;
|
|
27
69
|
this.isLoading = false;
|
|
70
|
+
/** The panel is on its way to empty: the sheen is on and the body is shutting over its content. */
|
|
71
|
+
this.leaving = false;
|
|
72
|
+
this.leaveGeneration = 0;
|
|
73
|
+
/**
|
|
74
|
+
* The body's last non-empty content, kept while the body is shut so the content slides away
|
|
75
|
+
* with it instead of vanishing the frame the state changes. Dropped once the body has settled.
|
|
76
|
+
*/
|
|
77
|
+
this.retainedBody = 'none';
|
|
78
|
+
this.runSkippedLookup = () => {
|
|
79
|
+
const vin = this.skippedVin;
|
|
80
|
+
if (!vin)
|
|
81
|
+
return;
|
|
82
|
+
void this.fetchVin(vin);
|
|
83
|
+
};
|
|
28
84
|
// #endregion
|
|
29
|
-
// #region Component
|
|
30
|
-
this.
|
|
85
|
+
// #region Component props
|
|
86
|
+
/** Shows a per-campaign "why this status?" control. The host gates it on its own permission check; the trace lists claim and invoice details. */
|
|
87
|
+
this.showTrace = false;
|
|
31
88
|
this.recaptchaKey = '';
|
|
89
|
+
/** Renders a click-to-pass stand-in for the reCAPTCHA widget. Implied by `isDev`; the real widget is only ever used in production mode. */
|
|
32
90
|
this.mockRecaptcha = false;
|
|
33
|
-
this.showWarranty = false;
|
|
34
91
|
this.unauthorizedSscLookupBaseUrl = '';
|
|
35
92
|
this.unauthorizedSscLookupQueryString = '';
|
|
36
93
|
this.cityId = null;
|
|
@@ -44,8 +101,10 @@ export class VehicleWarrantyDetails {
|
|
|
44
101
|
this.customerName = null;
|
|
45
102
|
this.customerPhone = null;
|
|
46
103
|
this.customerEmail = null;
|
|
104
|
+
// #endregion
|
|
105
|
+
// #region Manufacturer check (unauthorized vehicles)
|
|
106
|
+
/** The check is offered: the vehicle is unauthorized and the host configured a site key. */
|
|
47
107
|
this.showRecaptcha = false;
|
|
48
|
-
this.unInvoicedByBrokerName = null;
|
|
49
108
|
this.checkingUnauthorizedSSC = false;
|
|
50
109
|
this.devRecaptchaChecked = false;
|
|
51
110
|
this.recaptchaRes = null;
|
|
@@ -55,10 +114,16 @@ export class VehicleWarrantyDetails {
|
|
|
55
114
|
if (!this.mockRecaptchaTrigger)
|
|
56
115
|
return;
|
|
57
116
|
this.devRecaptchaChecked = true;
|
|
58
|
-
|
|
117
|
+
try {
|
|
118
|
+
await this.mockRecaptchaTrigger();
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
if (!isAbort(error))
|
|
122
|
+
console.error('SSC manufacturer check failed', error);
|
|
123
|
+
}
|
|
59
124
|
};
|
|
60
125
|
this.syncRecaptchaPosition = () => {
|
|
61
|
-
if (!this.recaptchaPlaceholderRef || !this.
|
|
126
|
+
if (!this.recaptchaPlaceholderRef || !this.recaptchaPortalEl || this.recaptchaPortalEl.style.display === 'none')
|
|
62
127
|
return;
|
|
63
128
|
const rect = this.recaptchaPlaceholderRef.getBoundingClientRect();
|
|
64
129
|
this.recaptchaPortalEl.style.top = `${rect.top}px`;
|
|
@@ -68,29 +133,52 @@ export class VehicleWarrantyDetails {
|
|
|
68
133
|
this.recaptchaPortalEl.style.pointerEvents = opacity < 0.1 ? 'none' : 'auto';
|
|
69
134
|
this.positionRAF = requestAnimationFrame(this.syncRecaptchaPosition);
|
|
70
135
|
};
|
|
136
|
+
this.traces = {};
|
|
137
|
+
this.traceLoading = false;
|
|
138
|
+
this.toggleTrace = async (key) => {
|
|
139
|
+
var _a, _b;
|
|
140
|
+
if (this.openTraceKey === key) {
|
|
141
|
+
this.openTraceKey = undefined;
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
this.openTraceKey = key;
|
|
145
|
+
const vin = (_a = this.vehicleLookup) === null || _a === void 0 ? void 0 : _a.vin;
|
|
146
|
+
if (!vin)
|
|
147
|
+
return;
|
|
148
|
+
// A response that already carries traces (a host that turned the option on for this caller,
|
|
149
|
+
// or mock data) needs no second request.
|
|
150
|
+
const seeded = Object.fromEntries((((_b = this.vehicleLookup) === null || _b === void 0 ? void 0 : _b.ssc) || []).map((item, index) => [sscTraceKey(item, index), item === null || item === void 0 ? void 0 : item.trace]).filter(([, trace]) => !!trace));
|
|
151
|
+
if (this.tracesVin !== vin && Object.keys(seeded).length) {
|
|
152
|
+
this.traces = seeded;
|
|
153
|
+
this.tracesVin = vin;
|
|
154
|
+
}
|
|
155
|
+
if (this.traces[key] || this.tracesVin === vin)
|
|
156
|
+
return;
|
|
157
|
+
await this.loadTraces(vin);
|
|
158
|
+
};
|
|
71
159
|
}
|
|
72
160
|
async componentWillLoad() {
|
|
73
161
|
await this.changeLanguage(this.language);
|
|
74
162
|
}
|
|
75
163
|
async changeLanguage(newLanguage) {
|
|
76
|
-
const [sharedLocales, locale] = await Promise.all([getSharedLocal(newLanguage), getLocaleLanguage(newLanguage, 'vehicleLookup.
|
|
164
|
+
const [sharedLocales, locale] = await Promise.all([getSharedLocal(newLanguage), getLocaleLanguage(newLanguage, 'vehicleLookup.ssc', sscSchema)]);
|
|
77
165
|
this.locale = Object.assign({ sharedLocales }, locale);
|
|
78
166
|
}
|
|
79
167
|
async setMockData(newMockData) {
|
|
80
168
|
this.mockData = newMockData;
|
|
81
169
|
}
|
|
82
170
|
async fetchVin(newData, headers = {}) {
|
|
83
|
-
this.
|
|
84
|
-
this.
|
|
85
|
-
|
|
171
|
+
this.leaveGeneration++;
|
|
172
|
+
this.skippedVin = undefined;
|
|
173
|
+
this.resetTraces();
|
|
174
|
+
// The check's machinery stops now; its widget stays on screen so it leaves with the body.
|
|
175
|
+
this.suspendManufacturerCheck();
|
|
86
176
|
await setVehicleLookupData(this, newData, headers, {
|
|
87
177
|
beforeAssignment: async (response, { scopedTimeoutRef }) => {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
this.unInvoicedByBrokerName = null;
|
|
93
|
-
await this.handleInitializingRecaptcha(response, scopedTimeoutRef);
|
|
178
|
+
// By now the body has settled shut (the helper's one-second wait outlasts --settle), so
|
|
179
|
+
// the previous vehicle's check can go and the next one's be prepared unseen.
|
|
180
|
+
this.resetManufacturerCheck();
|
|
181
|
+
this.prepareManufacturerCheck(response, scopedTimeoutRef);
|
|
94
182
|
return response;
|
|
95
183
|
},
|
|
96
184
|
});
|
|
@@ -98,30 +186,239 @@ export class VehicleWarrantyDetails {
|
|
|
98
186
|
async setErrorMessage(message) {
|
|
99
187
|
setVehicleLookupErrorState(this, message);
|
|
100
188
|
}
|
|
189
|
+
/** Back to "no vehicle": the body shuts over what it holds, then the panel is emptied unseen. */
|
|
101
190
|
async clearData() {
|
|
191
|
+
await this.leave();
|
|
192
|
+
this.emptyPanel();
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* The other panels were given a vehicle but this one's own lookup was not run for it — a wrapper
|
|
196
|
+
* with `sscQueryString` only counts the SSC tab's own request as a campaign check. The panel says
|
|
197
|
+
* so and offers to run the check itself; the VIN is kept for that.
|
|
198
|
+
*/
|
|
199
|
+
async skipLookup(vin) {
|
|
200
|
+
if (!this.vehicleLookup && this.skippedVin === vin)
|
|
201
|
+
return;
|
|
202
|
+
await this.leave();
|
|
203
|
+
this.emptyPanel();
|
|
204
|
+
this.skippedVin = vin;
|
|
205
|
+
}
|
|
206
|
+
onLoadingChange(newValue) {
|
|
207
|
+
smartInvokable.bind(this)(this.loadingStateChange, newValue);
|
|
208
|
+
}
|
|
209
|
+
/** How long a state change takes to settle: the --settle token plus a margin for the frame it starts on. */
|
|
210
|
+
settleMs() {
|
|
211
|
+
const raw = typeof getComputedStyle === 'function' ? getComputedStyle(this.el).getPropertyValue('--settle') : '';
|
|
212
|
+
const parsed = parseFloat(raw);
|
|
213
|
+
return (Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_SETTLE_MS) + 40;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Puts the chip and lead on the sheen, shuts the body over whatever it holds, and resolves once
|
|
217
|
+
* they have settled — so the caller can swap the content while nothing is on screen. Resolves at
|
|
218
|
+
* once when there is nothing to leave. A lookup started meanwhile takes over.
|
|
219
|
+
*/
|
|
220
|
+
async leave() {
|
|
221
|
+
var _a;
|
|
222
|
+
const generation = ++this.leaveGeneration;
|
|
223
|
+
if (!this.vehicleLookup && !this.skippedVin && !this.isError)
|
|
224
|
+
return;
|
|
225
|
+
clearTimeout(this.networkTimeoutRef);
|
|
226
|
+
(_a = this.abortController) === null || _a === void 0 ? void 0 : _a.abort();
|
|
227
|
+
this.suspendManufacturerCheck();
|
|
228
|
+
this.leaving = true;
|
|
229
|
+
await new Promise(resolve => setTimeout(resolve, this.settleMs()));
|
|
230
|
+
if (generation === this.leaveGeneration)
|
|
231
|
+
this.leaving = false;
|
|
232
|
+
}
|
|
233
|
+
emptyPanel() {
|
|
102
234
|
this.vehicleLookup = undefined;
|
|
103
|
-
this.recaptchaRes = null;
|
|
104
|
-
this.showRecaptcha = false;
|
|
105
|
-
this.devRecaptchaChecked = false;
|
|
106
|
-
this.checkingUnauthorizedSSC = false;
|
|
107
235
|
this.isError = false;
|
|
108
236
|
this.errorMessage = undefined;
|
|
109
237
|
this.isLoading = false;
|
|
110
|
-
|
|
238
|
+
this.skippedVin = undefined;
|
|
239
|
+
this.resetManufacturerCheck();
|
|
240
|
+
this.resetTraces();
|
|
111
241
|
}
|
|
112
|
-
|
|
113
|
-
|
|
242
|
+
componentDidRender() {
|
|
243
|
+
var _a, _b, _c;
|
|
244
|
+
this.followOpenDrawer();
|
|
245
|
+
const state = this.panelState();
|
|
246
|
+
const body = panelBody(state);
|
|
247
|
+
const signature = [
|
|
248
|
+
this.isLoading || this.leaving,
|
|
249
|
+
body,
|
|
250
|
+
this.retainedBody,
|
|
251
|
+
this.openTraceKey,
|
|
252
|
+
this.traceLoading,
|
|
253
|
+
this.traceError,
|
|
254
|
+
this.checkingUnauthorizedSSC,
|
|
255
|
+
this.showRecaptcha,
|
|
256
|
+
(_a = this.vehicleLookup) === null || _a === void 0 ? void 0 : _a.vin,
|
|
257
|
+
this.skippedVin,
|
|
258
|
+
(_b = this.recaptchaRes) === null || _b === void 0 ? void 0 : _b.status,
|
|
259
|
+
].join('|');
|
|
260
|
+
const changed = this.layoutSignature !== undefined && this.layoutSignature !== signature;
|
|
261
|
+
this.layoutSignature = signature;
|
|
262
|
+
if (!changed)
|
|
263
|
+
return;
|
|
264
|
+
(_c = this.heightAnnouncer) !== null && _c !== void 0 ? _c : (this.heightAnnouncer = createHeightChangeAnnouncer(this.el));
|
|
265
|
+
this.heightAnnouncer.announce(this.settleMs() + 80);
|
|
266
|
+
}
|
|
267
|
+
/** Remembers what the body shows, and forgets it a settle after the body shut. */
|
|
268
|
+
retainBody(body) {
|
|
269
|
+
if (body !== 'none') {
|
|
270
|
+
this.retainedBody = body;
|
|
271
|
+
clearTimeout(this.retainTimer);
|
|
272
|
+
this.retainTimer = undefined;
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
if (this.retainedBody !== 'none' && !this.retainTimer) {
|
|
276
|
+
this.retainTimer = setTimeout(() => {
|
|
277
|
+
this.retainTimer = undefined;
|
|
278
|
+
this.retainedBody = 'none';
|
|
279
|
+
forceUpdate(this);
|
|
280
|
+
}, this.settleMs());
|
|
281
|
+
}
|
|
114
282
|
}
|
|
115
283
|
async setBlazorRef(newBlazorRef) {
|
|
116
284
|
this.blazorRef = newBlazorRef;
|
|
117
285
|
}
|
|
286
|
+
/**
|
|
287
|
+
* Development never shows Google's widget. The stand-in is the default whenever `isDev` is on, and
|
|
288
|
+
* the real widget is created lazily, only when a production-mode lookup actually needs it — so a
|
|
289
|
+
* host that flips `isDev` after the element mounted (the dev showcase does) still gets the mock,
|
|
290
|
+
* instead of a real widget rendered at mount time sitting on top of a mock that never polls it.
|
|
291
|
+
*/
|
|
118
292
|
get useMockRecaptchaWidget() {
|
|
119
293
|
return this.isDev || this.mockRecaptcha;
|
|
120
294
|
}
|
|
295
|
+
onRecaptchaModeChange() {
|
|
296
|
+
this.syncRealRecaptchaVisibility();
|
|
297
|
+
}
|
|
298
|
+
/** Stops the check from answering — polling, the stand-in's trigger, a request in flight — without touching what is on screen. */
|
|
299
|
+
suspendManufacturerCheck() {
|
|
300
|
+
clearInterval(this.recaptchaIntervalRef);
|
|
301
|
+
this.mockRecaptchaTrigger = undefined;
|
|
302
|
+
}
|
|
303
|
+
/** Back to "nothing asked yet" — every new lookup, once the previous check has left the screen, and a cleared panel start here. */
|
|
304
|
+
resetManufacturerCheck() {
|
|
305
|
+
this.suspendManufacturerCheck();
|
|
306
|
+
clearTimeout(this.recaptchaHideTimer);
|
|
307
|
+
this.recaptchaRes = null;
|
|
308
|
+
this.showRecaptcha = false;
|
|
309
|
+
this.checkingUnauthorizedSSC = false;
|
|
310
|
+
this.devRecaptchaChecked = false;
|
|
311
|
+
this.hideRealRecaptcha();
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Offers the check for an unauthorized vehicle. Not awaited by the lookup: loading Google's script
|
|
315
|
+
* must not delay the vehicle landing on screen, so the real widget is armed in the background and
|
|
316
|
+
* checked against the lookup generation before it starts polling.
|
|
317
|
+
*/
|
|
318
|
+
prepareManufacturerCheck(newVehicleLookup, scopedTimeoutRef) {
|
|
319
|
+
if ((newVehicleLookup === null || newVehicleLookup === void 0 ? void 0 : newVehicleLookup.isAuthorized) !== false || this.recaptchaKey === '') {
|
|
320
|
+
this.showRecaptcha = false;
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
this.showRecaptcha = true;
|
|
324
|
+
if (this.useMockRecaptchaWidget) {
|
|
325
|
+
this.mockRecaptchaTrigger = () => this.runUnauthorizedSscLookup(newVehicleLookup, 'mock-recaptcha-token', scopedTimeoutRef);
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
void this.armRealRecaptcha(newVehicleLookup, scopedTimeoutRef);
|
|
329
|
+
}
|
|
330
|
+
async armRealRecaptcha(newVehicleLookup, scopedTimeoutRef) {
|
|
331
|
+
try {
|
|
332
|
+
await this.ensureRealRecaptcha();
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
console.error('reCAPTCHA could not be loaded', error);
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
// A newer lookup, a cleared panel or a flip to mock mode while the script loaded: this one is stale.
|
|
339
|
+
if (this.networkTimeoutRef !== scopedTimeoutRef || !this.showRecaptcha || this.useMockRecaptchaWidget)
|
|
340
|
+
return;
|
|
341
|
+
if (this.recaptchaWidgetId !== undefined)
|
|
342
|
+
grecaptcha.reset(this.recaptchaWidgetId);
|
|
343
|
+
this.syncRealRecaptchaVisibility();
|
|
344
|
+
clearInterval(this.recaptchaIntervalRef);
|
|
345
|
+
this.recaptchaIntervalRef = setInterval(async () => {
|
|
346
|
+
const recaptchaResponse = grecaptcha.getResponse(this.recaptchaWidgetId);
|
|
347
|
+
if (!recaptchaResponse)
|
|
348
|
+
return;
|
|
349
|
+
clearInterval(this.recaptchaIntervalRef);
|
|
350
|
+
try {
|
|
351
|
+
await this.runUnauthorizedSscLookup(newVehicleLookup, recaptchaResponse, scopedTimeoutRef);
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
if (!isAbort(error))
|
|
355
|
+
console.error('SSC manufacturer check failed', error);
|
|
356
|
+
}
|
|
357
|
+
}, 500);
|
|
358
|
+
}
|
|
359
|
+
/** Loads Google's script and renders the widget into a body-level portal, once per element. */
|
|
360
|
+
ensureRealRecaptcha() {
|
|
361
|
+
if (!this.recaptchaReady) {
|
|
362
|
+
this.recaptchaReady = new Promise((resolve, reject) => {
|
|
363
|
+
if (!this.recaptchaPortalEl) {
|
|
364
|
+
this.recaptchaPortalEl = document.createElement('div');
|
|
365
|
+
this.recaptchaPortalEl.style.cssText = 'position: fixed; z-index: 1; display: none;';
|
|
366
|
+
document.body.appendChild(this.recaptchaPortalEl);
|
|
367
|
+
}
|
|
368
|
+
const renderWidget = () => grecaptcha.ready(() => {
|
|
369
|
+
this.recaptchaWidgetId = grecaptcha.render(this.recaptchaPortalEl, { sitekey: this.recaptchaKey });
|
|
370
|
+
resolve();
|
|
371
|
+
});
|
|
372
|
+
if (typeof grecaptcha !== 'undefined' && typeof (grecaptcha === null || grecaptcha === void 0 ? void 0 : grecaptcha.render) === 'function') {
|
|
373
|
+
renderWidget();
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
const script = document.createElement('script');
|
|
377
|
+
script.src = RECAPTCHA_SCRIPT_SRC;
|
|
378
|
+
script.async = true;
|
|
379
|
+
script.defer = true;
|
|
380
|
+
script.onload = renderWidget;
|
|
381
|
+
script.onerror = () => {
|
|
382
|
+
this.recaptchaReady = undefined;
|
|
383
|
+
reject(new Error('reCAPTCHA script failed to load'));
|
|
384
|
+
};
|
|
385
|
+
document.head.appendChild(script);
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
return this.recaptchaReady;
|
|
389
|
+
}
|
|
390
|
+
hideRealRecaptcha() {
|
|
391
|
+
cancelAnimationFrame(this.positionRAF);
|
|
392
|
+
clearTimeout(this.recaptchaHideTimer);
|
|
393
|
+
if (this.recaptchaPortalEl)
|
|
394
|
+
this.recaptchaPortalEl.style.display = 'none';
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* The real widget is visible only while a production-mode check is offered and unanswered. It
|
|
398
|
+
* lives outside the shadow root, so the body cannot clip it as it shuts; instead it follows the
|
|
399
|
+
* body's opacity (see `getAncestorOpacity`) and is only taken down once the body has settled.
|
|
400
|
+
*/
|
|
401
|
+
syncRealRecaptchaVisibility() {
|
|
402
|
+
if (!this.recaptchaPortalEl)
|
|
403
|
+
return;
|
|
404
|
+
if (this.showRecaptcha && !this.recaptchaRes && !this.useMockRecaptchaWidget) {
|
|
405
|
+
clearTimeout(this.recaptchaHideTimer);
|
|
406
|
+
this.recaptchaPortalEl.style.display = 'block';
|
|
407
|
+
this.syncRecaptchaPosition();
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
clearTimeout(this.recaptchaHideTimer);
|
|
411
|
+
this.recaptchaHideTimer = setTimeout(() => this.hideRealRecaptcha(), this.settleMs());
|
|
412
|
+
}
|
|
413
|
+
onRecaptchaStateChange() {
|
|
414
|
+
this.syncRealRecaptchaVisibility();
|
|
415
|
+
}
|
|
121
416
|
async runUnauthorizedSscLookup(newVehicleLookup, recaptchaToken, scopedTimeoutRef) {
|
|
122
417
|
this.checkingUnauthorizedSSC = true;
|
|
123
418
|
if (this.isDev) {
|
|
124
419
|
await new Promise(r => setTimeout(r, 3000));
|
|
420
|
+
if (this.networkTimeoutRef !== scopedTimeoutRef)
|
|
421
|
+
return;
|
|
125
422
|
this.checkingUnauthorizedSSC = false;
|
|
126
423
|
const randomValue = Math.random();
|
|
127
424
|
const devSscLookupStatus = randomValue < 0.33 ? 0 : randomValue > 0.33 && randomValue < 0.66 ? 2 : 1;
|
|
@@ -131,162 +428,180 @@ export class VehicleWarrantyDetails {
|
|
|
131
428
|
smartInvokable.bind(this)(this.unauthorizedSscLookupResponse, devSscLookupStatus);
|
|
132
429
|
return;
|
|
133
430
|
}
|
|
431
|
+
// Resolved at call time: the token handed over with the search may have expired by the time
|
|
432
|
+
// the visitor completes the captcha.
|
|
433
|
+
const headers = await resolveRequestHeaders(this);
|
|
134
434
|
const response = await fetch(`${this.unauthorizedSscLookupBaseUrl}${newVehicleLookup === null || newVehicleLookup === void 0 ? void 0 : newVehicleLookup.vin}/${newVehicleLookup === null || newVehicleLookup === void 0 ? void 0 : newVehicleLookup.sscLogId}?${this.unauthorizedSscLookupQueryString}`, {
|
|
135
435
|
signal: this.abortController.signal,
|
|
136
|
-
headers: Object.assign(Object.assign({},
|
|
436
|
+
headers: Object.assign(Object.assign({}, headers), { 'Ssc-Recaptcha-Token': recaptchaToken }),
|
|
137
437
|
});
|
|
138
438
|
const vinResponse = await response.json();
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
this.recaptchaRes = {
|
|
142
|
-
status: vinResponse.sscLookupStatus === 0
|
|
143
|
-
? 'noRecall'
|
|
144
|
-
: vinResponse.sscLookupStatus === 1
|
|
145
|
-
? 'recallExists'
|
|
146
|
-
: vinResponse.sscLookupStatus === 2
|
|
147
|
-
? 'noApplicableVehicleFound'
|
|
148
|
-
: null,
|
|
149
|
-
};
|
|
150
|
-
smartInvokable.bind(this)(this.unauthorizedSscLookupResponse, vinResponse.sscLookupStatus);
|
|
151
|
-
}
|
|
152
|
-
else
|
|
153
|
-
throw new Error('wrongResponseFormat');
|
|
154
|
-
}
|
|
155
|
-
async handleInitializingRecaptcha(newVehicleLookup, scopedTimeoutRef) {
|
|
156
|
-
if ((newVehicleLookup === null || newVehicleLookup === void 0 ? void 0 : newVehicleLookup.isAuthorized) === false && this.showSsc && this.recaptchaKey !== '') {
|
|
157
|
-
this.devRecaptchaChecked = false;
|
|
158
|
-
if (this.useMockRecaptchaWidget) {
|
|
159
|
-
this.mockRecaptchaTrigger = () => this.runUnauthorizedSscLookup(newVehicleLookup, 'mock-recaptcha-token', scopedTimeoutRef);
|
|
160
|
-
this.showRecaptcha = true;
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
if (this.recaptchaWidgetId !== undefined) {
|
|
164
|
-
grecaptcha.reset(this.recaptchaWidgetId);
|
|
165
|
-
}
|
|
166
|
-
this.recaptchaIntervalRef = setInterval(async () => {
|
|
167
|
-
const recaptchaResponse = grecaptcha.getResponse(this.recaptchaWidgetId);
|
|
168
|
-
if (recaptchaResponse) {
|
|
169
|
-
clearInterval(this.recaptchaIntervalRef);
|
|
170
|
-
await this.runUnauthorizedSscLookup(newVehicleLookup, recaptchaResponse, scopedTimeoutRef);
|
|
171
|
-
}
|
|
172
|
-
}, 500);
|
|
173
|
-
this.showRecaptcha = true;
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
this.showRecaptcha = false;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
async componentDidLoad() {
|
|
180
|
-
if (this.useMockRecaptchaWidget)
|
|
439
|
+
// A newer lookup started while the manufacturer was answering: this answer is for a vehicle no longer shown.
|
|
440
|
+
if (this.networkTimeoutRef !== scopedTimeoutRef)
|
|
181
441
|
return;
|
|
182
|
-
if (
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
script.defer = true;
|
|
190
|
-
script.onload = () => {
|
|
191
|
-
grecaptcha.ready(() => {
|
|
192
|
-
this.recaptchaWidgetId = grecaptcha.render(this.recaptchaPortalEl, { sitekey: this.recaptchaKey });
|
|
193
|
-
});
|
|
194
|
-
};
|
|
195
|
-
document.head.appendChild(script);
|
|
196
|
-
}
|
|
442
|
+
if (!vinResponse)
|
|
443
|
+
throw new Error('wrongResponseFormat');
|
|
444
|
+
this.checkingUnauthorizedSSC = false;
|
|
445
|
+
this.recaptchaRes = {
|
|
446
|
+
status: vinResponse.sscLookupStatus === 0 ? 'noRecall' : vinResponse.sscLookupStatus === 1 ? 'recallExists' : vinResponse.sscLookupStatus === 2 ? 'noApplicableVehicleFound' : null,
|
|
447
|
+
};
|
|
448
|
+
smartInvokable.bind(this)(this.unauthorizedSscLookupResponse, vinResponse.sscLookupStatus);
|
|
197
449
|
}
|
|
198
450
|
disconnectedCallback() {
|
|
451
|
+
var _a, _b;
|
|
452
|
+
(_a = this.heightAnnouncer) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
453
|
+
this.stopFollowingDrawer();
|
|
199
454
|
cancelAnimationFrame(this.positionRAF);
|
|
200
455
|
clearInterval(this.recaptchaIntervalRef);
|
|
456
|
+
clearTimeout(this.recaptchaHideTimer);
|
|
457
|
+
clearTimeout(this.retainTimer);
|
|
458
|
+
(_b = this.traceAbortController) === null || _b === void 0 ? void 0 : _b.abort();
|
|
201
459
|
if (this.recaptchaPortalEl) {
|
|
202
460
|
this.recaptchaPortalEl.remove();
|
|
461
|
+
this.recaptchaPortalEl = undefined;
|
|
462
|
+
this.recaptchaReady = undefined;
|
|
463
|
+
this.recaptchaWidgetId = undefined;
|
|
203
464
|
}
|
|
204
465
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
466
|
+
/**
|
|
467
|
+
* How see-through the widget's place on the page is: the product of every ancestor's opacity,
|
|
468
|
+
* from the placeholder up through this shadow root (the body fading as it shuts) and on up the
|
|
469
|
+
* host page (a tab sliding out). The portal copies it, so the real widget leaves with the panel.
|
|
470
|
+
*/
|
|
471
|
+
getAncestorOpacity() {
|
|
472
|
+
let opacity = 1;
|
|
473
|
+
const walk = (from, until) => {
|
|
474
|
+
for (let el = from; el && el !== until; el = el.parentElement) {
|
|
475
|
+
const own = parseFloat(getComputedStyle(el).opacity);
|
|
476
|
+
if (!Number.isNaN(own))
|
|
477
|
+
opacity *= own;
|
|
478
|
+
}
|
|
479
|
+
};
|
|
480
|
+
walk(this.recaptchaPlaceholderRef, null);
|
|
481
|
+
walk(this.el, document.body);
|
|
482
|
+
return opacity;
|
|
483
|
+
}
|
|
484
|
+
resetTraces() {
|
|
485
|
+
var _a;
|
|
486
|
+
(_a = this.traceAbortController) === null || _a === void 0 ? void 0 : _a.abort();
|
|
487
|
+
this.stopFollowingDrawer();
|
|
488
|
+
this.openTraceKey = undefined;
|
|
489
|
+
this.traces = {};
|
|
490
|
+
this.tracesVin = undefined;
|
|
491
|
+
this.traceLoading = false;
|
|
492
|
+
this.traceError = undefined;
|
|
493
|
+
}
|
|
494
|
+
async loadTraces(vin) {
|
|
495
|
+
var _a, _b;
|
|
496
|
+
(_a = this.traceAbortController) === null || _a === void 0 ? void 0 : _a.abort();
|
|
497
|
+
this.traceAbortController = new AbortController();
|
|
498
|
+
const { signal } = this.traceAbortController;
|
|
499
|
+
this.traceLoading = true;
|
|
500
|
+
this.traceError = undefined;
|
|
501
|
+
try {
|
|
502
|
+
let response;
|
|
503
|
+
if (this.isDev) {
|
|
504
|
+
response = (_b = this.mockData) === null || _b === void 0 ? void 0 : _b[vin];
|
|
505
|
+
}
|
|
506
|
+
else {
|
|
507
|
+
if (!this.baseUrl)
|
|
508
|
+
throw new Error('noBaseUrl');
|
|
509
|
+
// KPI integrity: built from queryString alone. lookupQueryString (a wrapper's logging flag)
|
|
510
|
+
// must never join a trace request — this is a re-read, not a lookup. vehicle-ssc.spec.tsx pins it.
|
|
511
|
+
const query = [this.queryString, 'trace=ssc'].filter(Boolean).join('&');
|
|
512
|
+
const headers = await resolveRequestHeaders(this);
|
|
513
|
+
const httpResponse = await fetch(`${this.baseUrl}${vin}?${query}`, { headers, signal });
|
|
514
|
+
if (!httpResponse.ok)
|
|
515
|
+
throw new Error(`HTTP ${httpResponse.status}`);
|
|
516
|
+
response = (await httpResponse.json());
|
|
517
|
+
}
|
|
518
|
+
if (signal.aborted)
|
|
519
|
+
return;
|
|
520
|
+
const traces = {};
|
|
521
|
+
((response === null || response === void 0 ? void 0 : response.ssc) || []).forEach((item, index) => {
|
|
522
|
+
if (item === null || item === void 0 ? void 0 : item.trace)
|
|
523
|
+
traces[sscTraceKey(item, index)] = item.trace;
|
|
524
|
+
});
|
|
525
|
+
this.traces = traces;
|
|
526
|
+
this.tracesVin = vin;
|
|
527
|
+
this.traceError = Object.keys(traces).length ? undefined : this.locale.traceUnavailable;
|
|
211
528
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
529
|
+
catch (error) {
|
|
530
|
+
if (isAbort(error))
|
|
531
|
+
return;
|
|
532
|
+
console.error('SSC trace fetch failed', error);
|
|
533
|
+
this.traceError = this.locale.traceFailed;
|
|
215
534
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
while (el && el !== document.body) {
|
|
220
|
-
const opacity = parseFloat(getComputedStyle(el).opacity);
|
|
221
|
-
if (opacity < 1)
|
|
222
|
-
return opacity;
|
|
223
|
-
el = el.parentElement;
|
|
535
|
+
finally {
|
|
536
|
+
if (!signal.aborted)
|
|
537
|
+
this.traceLoading = false;
|
|
224
538
|
}
|
|
225
|
-
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* When a row's evidence opens, brings the row to the top of the page and keeps it there while the
|
|
542
|
+
* drawer slides open beneath it — as an expanded service-history line does — so the reader is
|
|
543
|
+
* looking at the evidence they asked for and not at the drawer's edge below the fold. Runs after
|
|
544
|
+
* every render and acts only when the open drawer changes; closing it, or leaving, lets go.
|
|
545
|
+
*/
|
|
546
|
+
followOpenDrawer() {
|
|
547
|
+
var _a, _b, _c;
|
|
548
|
+
const key = openDrawerKey({
|
|
549
|
+
campaigns: (_a = this.vehicleLookup) === null || _a === void 0 ? void 0 : _a.ssc,
|
|
550
|
+
showTrace: this.showTrace,
|
|
551
|
+
openTraceKey: this.openTraceKey,
|
|
552
|
+
traces: this.traces,
|
|
553
|
+
traceLoading: this.traceLoading,
|
|
554
|
+
});
|
|
555
|
+
if (key === this.followedDrawer)
|
|
556
|
+
return;
|
|
557
|
+
this.stopFollowingDrawer();
|
|
558
|
+
this.followedDrawer = key;
|
|
559
|
+
if (!key)
|
|
560
|
+
return;
|
|
561
|
+
const row = Array.from((_c = (_b = this.el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelectorAll('.ssc-row')) !== null && _c !== void 0 ? _c : []).find(el => el.getAttribute('data-trace-key') === key);
|
|
562
|
+
if (row)
|
|
563
|
+
this.stopFollowing = revealBelow(row, this.settleMs());
|
|
564
|
+
}
|
|
565
|
+
stopFollowingDrawer() {
|
|
566
|
+
var _a;
|
|
567
|
+
(_a = this.stopFollowing) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
568
|
+
this.stopFollowing = undefined;
|
|
569
|
+
this.followedDrawer = undefined;
|
|
226
570
|
}
|
|
227
571
|
// #endregion
|
|
228
|
-
|
|
229
|
-
var _a, _b, _c
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
label: this.locale.sscTableDescription,
|
|
239
|
-
},
|
|
240
|
-
{
|
|
241
|
-
nowrap: true,
|
|
242
|
-
key: 'sscTableRepairStatus',
|
|
243
|
-
label: this.locale.sscTableRepairStatus,
|
|
244
|
-
},
|
|
245
|
-
{
|
|
246
|
-
key: 'sscTableOPCode',
|
|
247
|
-
label: this.locale.sscTableOPCode,
|
|
248
|
-
},
|
|
249
|
-
{
|
|
250
|
-
key: 'sscTablePartNumber',
|
|
251
|
-
label: this.locale.sscTablePartNumber,
|
|
252
|
-
},
|
|
253
|
-
];
|
|
254
|
-
const rows = !((_a = this.vehicleLookup) === null || _a === void 0 ? void 0 : _a.ssc)
|
|
255
|
-
? []
|
|
256
|
-
: (_b = this.vehicleLookup) === null || _b === void 0 ? void 0 : _b.ssc.map(sscItem => ({
|
|
257
|
-
sscTableCode: sscItem === null || sscItem === void 0 ? void 0 : sscItem.sscCode,
|
|
258
|
-
sscTableDescription: sscItem === null || sscItem === void 0 ? void 0 : sscItem.description,
|
|
259
|
-
sscTableRepairStatus: () => (h("div", { class: "table-cell-container" }, h("img", { class: "table-status-icon", src: (sscItem === null || sscItem === void 0 ? void 0 : sscItem.repaired) ? CheckIcon : XIcon }), " ", sscItem === null || sscItem === void 0 ? void 0 :
|
|
260
|
-
sscItem.repairDate)),
|
|
261
|
-
sscTableOPCode: () => (h("div", { class: "table-cell-container table-cell-labors-container" }, (sscItem === null || sscItem === void 0 ? void 0 : sscItem.labors.length)
|
|
262
|
-
? sscItem === null || sscItem === void 0 ? void 0 : sscItem.labors.map(labor => (h("div", { key: labor === null || labor === void 0 ? void 0 : labor.laborCode, class: "success" }, labor === null || labor === void 0 ? void 0 : labor.laborCode)))
|
|
263
|
-
: '...')),
|
|
264
|
-
sscTablePartNumber: () => (h("div", { class: "table-cell-container table-cell-parts-container" }, (sscItem === null || sscItem === void 0 ? void 0 : sscItem.parts.length)
|
|
265
|
-
? sscItem === null || sscItem === void 0 ? void 0 : sscItem.parts.map(part => {
|
|
266
|
-
// Three availability states: in stock (green check), not in stock (red cross), or not checked
|
|
267
|
-
// — no Hub stock scope, or a repaired recall — which shows neutral grey with no icon.
|
|
268
|
-
const state = (part === null || part === void 0 ? void 0 : part.isAvailable) === true ? 'available' : (part === null || part === void 0 ? void 0 : part.isAvailable) === false ? 'unavailable' : 'unchecked';
|
|
269
|
-
return (h("div", { key: part === null || part === void 0 ? void 0 : part.partNumber, class: cn('part-chip', state) }, state !== 'unchecked' && h("img", { class: "part-chip-icon", src: state === 'available' ? CheckIcon : XIcon }), h("span", null, part === null || part === void 0 ? void 0 : part.partNumber)));
|
|
270
|
-
})
|
|
271
|
-
: '...')),
|
|
272
|
-
}));
|
|
273
|
-
const templateRow = {
|
|
274
|
-
sscTableOPCode: () => h("div", { class: "h-[25px]" }),
|
|
275
|
-
sscTablePartNumber: () => h("div", { class: "h-[25px]" }),
|
|
276
|
-
sscTableRepairStatus: () => h("div", { class: "h-[25px]" }),
|
|
572
|
+
panelState() {
|
|
573
|
+
var _a, _b, _c;
|
|
574
|
+
return {
|
|
575
|
+
locale: this.locale,
|
|
576
|
+
vehicleLoaded: !!this.vehicleLookup,
|
|
577
|
+
authorized: (_a = this.vehicleLookup) === null || _a === void 0 ? void 0 : _a.isAuthorized,
|
|
578
|
+
campaigns: (_b = this.vehicleLookup) === null || _b === void 0 ? void 0 : _b.ssc,
|
|
579
|
+
skipped: !!this.skippedVin,
|
|
580
|
+
checkAvailable: this.recaptchaKey !== '',
|
|
581
|
+
checkStatus: (_c = this.recaptchaRes) === null || _c === void 0 ? void 0 : _c.status,
|
|
277
582
|
};
|
|
278
|
-
return (h(Host, { translate: "no" }, h(VehicleInfoLayout, { isError: this.isError, coreOnly: this.coreOnly, isLoading: this.isLoading, header: (_c = this.vehicleLookup) === null || _c === void 0 ? void 0 : _c.vin, direction: this.locale.sharedLocales.direction, errorMessage: this.locale.sharedLocales.errors[this.errorMessage] || this.locale.sharedLocales.errors.wildCard }, h("div", { class: "p-[16px]" }, this.showWarranty && (h(CardsContainer, { isLoading: this.isLoading, warrantyLocale: this.locale, vehicleInformation: this.vehicleLookup, isAuthorized: (_d = this.vehicleLookup) === null || _d === void 0 ? void 0 : _d.isAuthorized, unInvoicedByBrokerName: this.unInvoicedByBrokerName })), h("div", { class: "h-[8px]" }), h("flexible-container", { isOpened: this.showRecaptcha, classes: cn('w-fit mx-auto shift-skeleton', { loading: !this.showRecaptcha || this.isLoading }) }, h("div", { style: { height: 'auto' }, class: "recaptcha-container" }, this.useMockRecaptchaWidget ? (h("div", { ref: el => (this.recaptchaPlaceholderRef = el), onClick: this.handleDevRecaptchaClick, class: cn('dev-recaptcha', { 'dev-recaptcha-disabled': this.devRecaptchaChecked }) }, h("div", { class: cn('dev-recaptcha-checkbox', { checked: this.devRecaptchaChecked }) }, this.devRecaptchaChecked && h("span", { class: "dev-recaptcha-checkmark" }, "\u2713")), h("div", { class: "dev-recaptcha-label" }, "I'm not a robot"), h("div", { class: "dev-recaptcha-brand" }, h("div", { class: "dev-recaptcha-brand-name" }, "reCAPTCHA"), h("div", { class: "dev-recaptcha-brand-mock" }, "(dev mock)")))) : (h("div", { ref: el => (this.recaptchaPlaceholderRef = el), style: { minWidth: '302px', minHeight: '76px' } }))), this.recaptchaRes && (h("div", { class: cn('recaptcha-response', ((_e = this.recaptchaRes) === null || _e === void 0 ? void 0 : _e.status) === 'recallExists' ? 'reject-card ' : ((_f = this.recaptchaRes) === null || _f === void 0 ? void 0 : _f.status) === 'noRecall' ? 'success-card ' : 'warning-card ') }, this.locale[(_g = this.recaptchaRes) === null || _g === void 0 ? void 0 : _g.status])))), h("flexible-container", { isOpened: this.checkingUnauthorizedSSC, classes: "w-fit mx-auto" }, h("div", { class: "pt-[16px]" }, h("div", { class: "flex shift-skeleton flex-col gap-[8px]" }, h("strong", null, this.locale.checkingTMC), h("div", { class: "relative pt-[40px]" }, h("loading-spinner", { isLoading: this.checkingUnauthorizedSSC }))))), this.showSsc && (h("div", { class: "mt-[32px] w-full" }, h("div", { class: "bg-[#f6f6f6] h-[50px] flex items-center justify-center px-[16px] font-bold text-[18px]" }, this.locale.sscCampings), h("div", { class: "overflow-x-auto" }, h("information-table", { allowAutoWidth: true, isLoading: this.isLoading, templateRow: templateRow, rows: rows, headers: tableHeaders })))))));
|
|
279
583
|
}
|
|
280
|
-
|
|
584
|
+
render() {
|
|
585
|
+
var _a, _b;
|
|
586
|
+
const state = this.panelState();
|
|
587
|
+
this.retainBody(panelBody(state));
|
|
588
|
+
// The widget block for an unauthorized vehicle: the stand-in or the real widget's anchor. It
|
|
589
|
+
// stays rendered after the manufacturer has answered — the body shuts over it and it leaves
|
|
590
|
+
// with the body — and is dropped with the check on the next lookup. Rendered by the campaigns
|
|
591
|
+
// panel inside its "check" body only, so it can never sit beside a list.
|
|
592
|
+
const manufacturerCheck = this.showRecaptcha && (h("div", { key: 'dcbff9ed43160482ef7b6573ae1d59aa5daa751d', class: "ssc-check-widget" }, h("div", { key: '3e9e0f41e871b4aa60a557d1d517e9d012e04ed3', class: "recaptcha-container" }, this.useMockRecaptchaWidget ? (h("div", { ref: el => (this.recaptchaPlaceholderRef = el), onClick: this.handleDevRecaptchaClick, class: cn('dev-recaptcha', { 'dev-recaptcha-disabled': this.devRecaptchaChecked }) }, h("div", { class: cn('dev-recaptcha-checkbox', { checked: this.devRecaptchaChecked }) }, this.devRecaptchaChecked && h("span", { class: "dev-recaptcha-checkmark" }, "\u2713")), h("div", { class: "dev-recaptcha-label" }, "I'm not a robot"), h("div", { class: "dev-recaptcha-brand" }, h("div", { class: "dev-recaptcha-brand-name" }, "reCAPTCHA"), h("div", { class: "dev-recaptcha-brand-mock" }, "(dev mock)")))) : (h("div", { ref: el => (this.recaptchaPlaceholderRef = el), style: { minWidth: '302px', minHeight: '76px' } })))));
|
|
593
|
+
return (h(Host, { key: '55baf0475afa6d3f4a37c65c2ad4a5f1c177e334', translate: "no" }, h(VehicleInfoLayout, { key: '08a2eee97c9e97a0eb9d7a9bd99c0055b1a19fd0', isError: this.isError, coreOnly: this.coreOnly, isLoading: this.isLoading, header: (_b = (_a = this.vehicleLookup) === null || _a === void 0 ? void 0 : _a.vin) !== null && _b !== void 0 ? _b : this.skippedVin, direction: this.locale.sharedLocales.direction, errorMessage: this.locale.sharedLocales.errors[this.errorMessage] || this.locale.sharedLocales.errors.wildCard }, h("div", { key: '355b56a6bf16cab6b8eeaebd362fd7d0fdf37efa', class: "ssc-panel", dir: this.locale.sharedLocales.direction }, h(SscCampaigns, Object.assign({ key: '3b5ae414e28c472fad1deeaa38238cd71aee72e2' }, state, { loading: this.isLoading || this.leaving, checking: this.checkingUnauthorizedSSC, retainedBody: this.retainedBody, onRunLookup: this.runSkippedLookup, showTrace: this.showTrace, openTraceKey: this.openTraceKey, traces: this.traces, traceLoading: this.traceLoading, traceError: this.traceError, onToggleTrace: this.toggleTrace }), manufacturerCheck)))));
|
|
594
|
+
}
|
|
595
|
+
static get is() { return "vehicle-ssc"; }
|
|
281
596
|
static get encapsulation() { return "shadow"; }
|
|
282
597
|
static get originalStyleUrls() {
|
|
283
598
|
return {
|
|
284
|
-
"$": ["vehicle-
|
|
599
|
+
"$": ["vehicle-ssc.css"]
|
|
285
600
|
};
|
|
286
601
|
}
|
|
287
602
|
static get styleUrls() {
|
|
288
603
|
return {
|
|
289
|
-
"$": ["vehicle-
|
|
604
|
+
"$": ["vehicle-ssc.css"]
|
|
290
605
|
};
|
|
291
606
|
}
|
|
292
607
|
static get properties() {
|
|
@@ -408,7 +723,7 @@ export class VehicleWarrantyDetails {
|
|
|
408
723
|
"optional": false,
|
|
409
724
|
"docs": {
|
|
410
725
|
"tags": [],
|
|
411
|
-
"text": ""
|
|
726
|
+
"text": "Static headers the host set on the element. The floor every request starts from."
|
|
412
727
|
},
|
|
413
728
|
"getter": false,
|
|
414
729
|
"setter": false,
|
|
@@ -434,6 +749,70 @@ export class VehicleWarrantyDetails {
|
|
|
434
749
|
"attribute": "query-string",
|
|
435
750
|
"defaultValue": "''"
|
|
436
751
|
},
|
|
752
|
+
"lookupQueryString": {
|
|
753
|
+
"type": "string",
|
|
754
|
+
"mutable": false,
|
|
755
|
+
"complexType": {
|
|
756
|
+
"original": "string",
|
|
757
|
+
"resolved": "string",
|
|
758
|
+
"references": {}
|
|
759
|
+
},
|
|
760
|
+
"required": false,
|
|
761
|
+
"optional": false,
|
|
762
|
+
"docs": {
|
|
763
|
+
"tags": [],
|
|
764
|
+
"text": "Appended to the campaign lookup request only, never to the trace request. A wrapper passes its\n`sscQueryString` \u2014 typically a lookup-logging flag \u2014 here rather than into `queryString`, so\nopening a campaign's evidence (a re-read of a lookup that was already logged) is never counted\nas another lookup. The host's endpoint must refuse to log traced requests as well."
|
|
765
|
+
},
|
|
766
|
+
"getter": false,
|
|
767
|
+
"setter": false,
|
|
768
|
+
"reflect": false,
|
|
769
|
+
"attribute": "lookup-query-string",
|
|
770
|
+
"defaultValue": "''"
|
|
771
|
+
},
|
|
772
|
+
"requestHeadersProvider": {
|
|
773
|
+
"type": "unknown",
|
|
774
|
+
"mutable": false,
|
|
775
|
+
"complexType": {
|
|
776
|
+
"original": "RequestHeadersProvider",
|
|
777
|
+
"resolved": "() => object | Promise<object>",
|
|
778
|
+
"references": {
|
|
779
|
+
"RequestHeadersProvider": {
|
|
780
|
+
"location": "import",
|
|
781
|
+
"path": "~features/vehicle-lookup-component",
|
|
782
|
+
"id": "src/features/vehicle-lookup-component/index.ts::RequestHeadersProvider",
|
|
783
|
+
"referenceLocation": "RequestHeadersProvider"
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
},
|
|
787
|
+
"required": false,
|
|
788
|
+
"optional": true,
|
|
789
|
+
"docs": {
|
|
790
|
+
"tags": [],
|
|
791
|
+
"text": "Asked for the current headers before every request this component makes itself; lets a host refresh its token on demand."
|
|
792
|
+
},
|
|
793
|
+
"getter": false,
|
|
794
|
+
"setter": false
|
|
795
|
+
},
|
|
796
|
+
"blazorRequestHeadersProvider": {
|
|
797
|
+
"type": "string",
|
|
798
|
+
"mutable": false,
|
|
799
|
+
"complexType": {
|
|
800
|
+
"original": "string",
|
|
801
|
+
"resolved": "string",
|
|
802
|
+
"references": {}
|
|
803
|
+
},
|
|
804
|
+
"required": false,
|
|
805
|
+
"optional": false,
|
|
806
|
+
"docs": {
|
|
807
|
+
"tags": [],
|
|
808
|
+
"text": "Name of a [JSInvokable] method on the Blazor reference that answers with the current headers."
|
|
809
|
+
},
|
|
810
|
+
"getter": false,
|
|
811
|
+
"setter": false,
|
|
812
|
+
"reflect": false,
|
|
813
|
+
"attribute": "blazor-request-headers-provider",
|
|
814
|
+
"defaultValue": "''"
|
|
815
|
+
},
|
|
437
816
|
"errorCallback": {
|
|
438
817
|
"type": "string",
|
|
439
818
|
"mutable": false,
|
|
@@ -550,7 +929,7 @@ export class VehicleWarrantyDetails {
|
|
|
550
929
|
"reflect": false,
|
|
551
930
|
"attribute": "unauthorized-ssc-lookup-response"
|
|
552
931
|
},
|
|
553
|
-
"
|
|
932
|
+
"showTrace": {
|
|
554
933
|
"type": "boolean",
|
|
555
934
|
"mutable": false,
|
|
556
935
|
"complexType": {
|
|
@@ -562,12 +941,12 @@ export class VehicleWarrantyDetails {
|
|
|
562
941
|
"optional": false,
|
|
563
942
|
"docs": {
|
|
564
943
|
"tags": [],
|
|
565
|
-
"text": ""
|
|
944
|
+
"text": "Shows a per-campaign \"why this status?\" control. The host gates it on its own permission check; the trace lists claim and invoice details."
|
|
566
945
|
},
|
|
567
946
|
"getter": false,
|
|
568
947
|
"setter": false,
|
|
569
948
|
"reflect": false,
|
|
570
|
-
"attribute": "show-
|
|
949
|
+
"attribute": "show-trace",
|
|
571
950
|
"defaultValue": "false"
|
|
572
951
|
},
|
|
573
952
|
"recaptchaKey": {
|
|
@@ -602,7 +981,7 @@ export class VehicleWarrantyDetails {
|
|
|
602
981
|
"optional": false,
|
|
603
982
|
"docs": {
|
|
604
983
|
"tags": [],
|
|
605
|
-
"text": ""
|
|
984
|
+
"text": "Renders a click-to-pass stand-in for the reCAPTCHA widget. Implied by `isDev`; the real widget is only ever used in production mode."
|
|
606
985
|
},
|
|
607
986
|
"getter": false,
|
|
608
987
|
"setter": false,
|
|
@@ -610,26 +989,6 @@ export class VehicleWarrantyDetails {
|
|
|
610
989
|
"attribute": "mock-recaptcha",
|
|
611
990
|
"defaultValue": "false"
|
|
612
991
|
},
|
|
613
|
-
"showWarranty": {
|
|
614
|
-
"type": "boolean",
|
|
615
|
-
"mutable": false,
|
|
616
|
-
"complexType": {
|
|
617
|
-
"original": "boolean",
|
|
618
|
-
"resolved": "boolean",
|
|
619
|
-
"references": {}
|
|
620
|
-
},
|
|
621
|
-
"required": false,
|
|
622
|
-
"optional": false,
|
|
623
|
-
"docs": {
|
|
624
|
-
"tags": [],
|
|
625
|
-
"text": ""
|
|
626
|
-
},
|
|
627
|
-
"getter": false,
|
|
628
|
-
"setter": false,
|
|
629
|
-
"reflect": false,
|
|
630
|
-
"attribute": "show-warranty",
|
|
631
|
-
"defaultValue": "false"
|
|
632
|
-
},
|
|
633
992
|
"unauthorizedSscLookupBaseUrl": {
|
|
634
993
|
"type": "string",
|
|
635
994
|
"mutable": false,
|
|
@@ -899,12 +1258,17 @@ export class VehicleWarrantyDetails {
|
|
|
899
1258
|
"errorMessage": {},
|
|
900
1259
|
"isLoading": {},
|
|
901
1260
|
"vehicleLookup": {},
|
|
1261
|
+
"skippedVin": {},
|
|
1262
|
+
"leaving": {},
|
|
902
1263
|
"blazorRef": {},
|
|
903
1264
|
"showRecaptcha": {},
|
|
904
|
-
"unInvoicedByBrokerName": {},
|
|
905
1265
|
"checkingUnauthorizedSSC": {},
|
|
906
1266
|
"devRecaptchaChecked": {},
|
|
907
|
-
"recaptchaRes": {}
|
|
1267
|
+
"recaptchaRes": {},
|
|
1268
|
+
"openTraceKey": {},
|
|
1269
|
+
"traces": {},
|
|
1270
|
+
"traceLoading": {},
|
|
1271
|
+
"traceError": {}
|
|
908
1272
|
};
|
|
909
1273
|
}
|
|
910
1274
|
static get methods() {
|
|
@@ -1007,7 +1371,28 @@ export class VehicleWarrantyDetails {
|
|
|
1007
1371
|
"return": "Promise<void>"
|
|
1008
1372
|
},
|
|
1009
1373
|
"docs": {
|
|
1010
|
-
"text": "",
|
|
1374
|
+
"text": "Back to \"no vehicle\": the body shuts over what it holds, then the panel is emptied unseen.",
|
|
1375
|
+
"tags": []
|
|
1376
|
+
}
|
|
1377
|
+
},
|
|
1378
|
+
"skipLookup": {
|
|
1379
|
+
"complexType": {
|
|
1380
|
+
"signature": "(vin: string) => Promise<void>",
|
|
1381
|
+
"parameters": [{
|
|
1382
|
+
"name": "vin",
|
|
1383
|
+
"type": "string",
|
|
1384
|
+
"docs": ""
|
|
1385
|
+
}],
|
|
1386
|
+
"references": {
|
|
1387
|
+
"Promise": {
|
|
1388
|
+
"location": "global",
|
|
1389
|
+
"id": "global::Promise"
|
|
1390
|
+
}
|
|
1391
|
+
},
|
|
1392
|
+
"return": "Promise<void>"
|
|
1393
|
+
},
|
|
1394
|
+
"docs": {
|
|
1395
|
+
"text": "The other panels were given a vehicle but this one's own lookup was not run for it \u2014 a wrapper\nwith `sscQueryString` only counts the SSC tab's own request as a campaign check. The panel says\nso and offers to run the check itself; the VIN is kept for that.",
|
|
1011
1396
|
"tags": []
|
|
1012
1397
|
}
|
|
1013
1398
|
},
|
|
@@ -1048,9 +1433,18 @@ export class VehicleWarrantyDetails {
|
|
|
1048
1433
|
}, {
|
|
1049
1434
|
"propName": "isLoading",
|
|
1050
1435
|
"methodName": "onLoadingChange"
|
|
1436
|
+
}, {
|
|
1437
|
+
"propName": "isDev",
|
|
1438
|
+
"methodName": "onRecaptchaModeChange"
|
|
1439
|
+
}, {
|
|
1440
|
+
"propName": "mockRecaptcha",
|
|
1441
|
+
"methodName": "onRecaptchaModeChange"
|
|
1051
1442
|
}, {
|
|
1052
1443
|
"propName": "showRecaptcha",
|
|
1053
|
-
"methodName": "
|
|
1444
|
+
"methodName": "onRecaptchaStateChange"
|
|
1445
|
+
}, {
|
|
1446
|
+
"propName": "recaptchaRes",
|
|
1447
|
+
"methodName": "onRecaptchaStateChange"
|
|
1054
1448
|
}];
|
|
1055
1449
|
}
|
|
1056
1450
|
}
|