1import { 2 validateInput 3} from "./chunk-W3RKY5WP.js"; 4import { 5 CFErrorWithCause, 6 CFFetcherError, 7 CFstackWithCauses, 8 Fetcher, 9 checkoutNonceParams, 10 fetchCheckoutNonce, 11 init_error_with_cause, 12 init_fetcher, 13 init_nonce 14} from "./chunk-NXH5VC2T.js"; 15import { 16 getSelectedVariant, 17 init_addToCart 18} from "./chunk-Q6RFXGRD.js"; 19import { 20 Cart, 21 atom, 22 batched, 23 cleanEmptyObjectKeys, 24 computed, 25 init_Cart, 26 init_general, 27 init_nanostores, 28 isElementVisibleOnViewport, 29 map, 30 onMount, 31 sleepMs 32} from "./chunk-BY72GGKB.js"; 33import { 34 validateValue 35} from "./chunk-4AIF3XZW.js"; 36import { 37 init_checkbox_v1, 38 init_radio_v1 39} from "./chunk-Y32E43UA.js"; 40import { 41 init_input_v1 42} from "./chunk-7HBS56XK.js"; 43import { 44 addPageScroll, 45 closeOnClickOutside, 46 init_cfLodash, 47 init_cf_utils, 48 isEqual, 49 isEventInside, 50 removePageScroll, 51 uuidv4 52} from "./chunk-KIZY5IRN.js"; 53import { 54 init_modal_v1 55} from "./chunk-5NUE6T5P.js"; 56import { 57 CF2Component, 58 init_runtime, 59 registerComponent 60} from "./chunk-NQUHJ6NR.js"; 61import { 62 __privateAdd, 63 __privateGet, 64 __privateMethod, 65 __privateSet, 66 __publicField, 67 init_define_process 68} from "./chunk-RFSPGZ3L.js"; 69
70// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-tos-v1.ts 71init_define_process(); 72init_checkbox_v1(); 73init_runtime(); 74var CheckoutTosV1 = class extends CF2Component { 75 constructor(el, runtimeSel) { 76 super(el, runtimeSel); 77 } 78 onAcceptedChange(accepted) { 79 } 80 get accepted() { 81 return this.element.querySelector("input").checked; 82 } 83 mount() { 84 const input = this.element.querySelector("input"); 85 input.addEventListener("change", (event) => { 86 this.onAcceptedChange(!!event?.target?.checked); 87 }); 88 } 89}; 90registerComponent("CheckoutTos/V1", CheckoutTosV1); 91window["CheckoutTosV1"] = CheckoutTosV1; 92
93// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-multi-step-v2.ts 94init_define_process(); 95init_general(); 96init_runtime(); 97var CheckoutMultiStepV2 = class extends CF2Component { 98 constructor(el, runtimeSel) { 99 super(el, runtimeSel); 100 } 101 // TODO: For now we have to register it like this 102 // We can use a special syntax to register it in the future 103 // like @Handler(onStepChange) and process it in the build phase 104 onStepChange(oldStep, step) { 105 } 106 onValidateStep(step) { 107 } 108 mount() { 109 this.totalSteps = parseInt(this.totalSteps); 110 this.totalStepsArray = [...Array(this.totalSteps).keys()]; 111 const body = this.element.querySelectorAll(".elMultiStepBody"); 112 const headers = this.element.querySelectorAll(".elMultiStepHeader"); 113 this.steps = this.totalStepsArray.map((i) => { 114 return { 115 body: body[i], 116 header: headers[i] 117 }; 118 }); 119 headers.forEach((header, stepNumber) => { 120 header.addEventListener("click", (evt) => { 121 evt.preventDefault(); 122 this.setStep(stepNumber); 123 }); 124 }); 125 const buttons = this.element.querySelectorAll('[href="#!next-step"], [href="#!prev-step"], [href="#!open-step"]'); 126 buttons.forEach((button) => { 127 const href = button.getAttribute("href"); 128 if (href === "#!next-step") { 129 button.addEventListener("click", (evt) => { 130 evt.preventDefault(); 131 if (button.dataset.disabled == "true") return; 132 this.nextStep(); 133 }); 134 } else if (href === "#!prev-step") { 135 button.addEventListener("click", (evt) => { 136 evt.preventDefault(); 137 if (button.dataset.disabled == "true") return; 138 this.prevStep(); 139 }); 140 } 141 }); 142 Checkout.store.state.listen((state) => { 143 if (state === Checkout.StoreStates.INITIALIZED) { 144 document.addEventListener("keydown", (evt) => { 145 if (evt.isComposing || evt.keyCode === 229) return; 146 const activeStep = this.element.querySelector(".elMultiStepBody[data-step-state='active']"); 147 const checkoutElement = this.element.closest(".elCheckout"); 148 const activeNextStepButton = activeStep.querySelector('[href="#!next-step"]'); 149 if (evt.keyCode === 13 && activeNextStepButton && isElementVisibleOnViewport(checkoutElement, 20)) { 150 activeNextStepButton.focus(); 151 this.nextStep(); 152 } 153 }); 154 } 155 }); 156 Checkout.store.checkout.step.listen((step) => { 157 this.changeStep(step); 158 }); 159 } 160 changeStep(step) { 161 const activeUiStep = this.element.querySelector(".elMultiStepBody[data-step-state='active']").dataset.stepNumber; 162 const oldStep = this.convertUiStepToData(activeUiStep); 163 if (oldStep != step) { 164 this.setStepActive(oldStep, step); 165 } 166 } 167 async validateStep(step) { 168 return (await Promise.all(this.onValidateStep(step)))?.every((result) => result); 169 } 170 setStepActive(oldStep, step) { 171 this.onStepChange(oldStep, step); 172 this.totalStepsArray.forEach((stepNumber) => { 173 const isCurrentStep = stepNumber == step; 174 const activeText = isCurrentStep ? "active" : "inactive"; 175 this.steps[stepNumber].body.setAttribute("data-step-state", activeText); 176 const header = this.steps[stepNumber].header; 177 if (header) { 178 header.setAttribute("data-step-state", activeText); 179 if (header.children.length > 0) { 180 header.children[0].setAttribute("data-step-state", activeText); 181 } 182 } 183 }); 184 $([document.documentElement, document.body]).animate({ 185 scrollTop: $(this.element).offset().top - 50 186 }, 200); 187 } 188 setStep(step) { 189 Checkout.store.checkout.step.set(step); 190 } 191 async nextStep() { 192 const currentStep = Checkout.store.checkout.step.get(); 193 if (await this.validateStep(currentStep)) { 194 this.setStep(currentStep + 1); 195 } 196 } 197 prevStep() { 198 const step = Checkout.store.checkout.step.get() - 1; 199 this.setStep(step); 200 } 201 convertUiStepToData(step) { 202 return parseInt(step) - 1; 203 } 204}; 205registerComponent("CheckoutMultiStep/V2", CheckoutMultiStepV2); 206window["CheckoutMultiStepV2"] = CheckoutMultiStepV2; 207
208// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-coupon-form-v1.ts 209init_define_process(); 210init_input_v1(); 211init_runtime(); 212var CheckoutCouponFormV1 = class extends CF2Component { 213 constructor(el, runtimeSel) { 214 super(el, runtimeSel); 215 } 216 hydrate(store) { 217 this.checkoutStore = store; 218 this.isCouponReadySubs = Checkout.computed.isCouponReady.subscribe((isCouponReady) => { 219 this.updateElementWithCanApply(isCouponReady); 220 }); 221 this.currentCodeListen = this.checkoutStore.coupons.currentCode.listen((value) => { 222 if (this.checkoutStore.coupons.state.get() === Checkout.CouponStates.APPLIED) return; 223 this.setInputValue(value); 224 }); 225 this.couponsStateListen = this.checkoutStore.coupons.state.listen((state) => { 226 this.updateElementWithCouponState(state); 227 }); 228 this.renderElement(); 229 this.setupInputListeners(); 230 } 231 cleanup() { 232 this.isCouponReadySubs?.(); 233 this.currentCodeListen?.(); 234 this.couponsStateListen?.(); 235 } 236 updateElementWithCanApply(isCouponReady) { 237 if (isCouponReady) { 238 const appliedCode = Checkout.store.coupons.appliedCode.get(); 239 if (!appliedCode) { 240 this.enableCoupon(); 241 } 242 } else { 243 this.disableCoupon(); 244 } 245 } 246 updateElementWithCouponState(state) { 247 switch (state) { 248 case Checkout.CouponStates.READY: { 249 this.clearError(); 250 this.enableCoupon(); 251 this.hideAppliedChip(); 252 this.updateLoader(false); 253 break; 254 } 255 case Checkout.CouponStates.ERROR: { 256 this.setError(this.checkoutStore.coupons.errorMessage.get()); 257 this.enableCoupon(); 258 this.hideAppliedChip(); 259 this.updateLoader(false); 260 break; 261 } 262 case Checkout.CouponStates.APPLIED: { 263 this.clearError(); 264 this.disableCoupon(); 265 this.setInputValue(""); 266 this.showAppliedChip(this.checkoutStore.coupons.appliedCode.get()); 267 this.updateLoader(false); 268 break; 269 } 270 case Checkout.CouponStates.APPLYING: { 271 this.disableCoupon(); 272 this.clearError(); 273 this.hideAppliedChip(); 274 this.updateLoader(true); 275 break; 276 } 277 } 278 } 279 renderElement() { 280 const currentCode = this.checkoutStore.coupons.currentCode.get(); 281 const state = this.checkoutStore.coupons.state.get(); 282 if (state !== Checkout.CouponStates.APPLIED && currentCode) { 283 this.getCouponInput().value = currentCode; 284 this.getCouponInputContainer().classList.add("hasValue"); 285 } 286 this.updateElementWithCouponState(state); 287 const isCouponReady = Checkout.computed.isCouponReady.get(); 288 this.updateElementWithCanApply(isCouponReady); 289 } 290 setupInputListeners() { 291 const input = this.getCouponInput(); 292 if (input !== null) { 293 input.addEventListener("blur", () => { 294 this.checkoutStore.coupons.currentCode.set(input.value?.trim()); 295 }); 296 input.addEventListener("focus", () => { 297 if (!input.value) { 298 this.clearError(); 299 } 300 }); 301 input.addEventListener("change", () => { 302 this.clearError(); 303 }); 304 input.addEventListener("keydown", (evt) => { 305 if (evt.isComposing || evt.keyCode === 229) return; 306 if (evt.key === "Enter") { 307 evt.preventDefault(); 308 evt.stopPropagation(); 309 evt.stopImmediatePropagation(); 310 this.applyCoupon(); 311 } 312 }); 313 } 314 this.getCouponApplyButton().addEventListener("click", (ev) => { 315 ev.preventDefault(); 316 ev.stopPropagation(); 317 this.applyCoupon(); 318 }); 319 this.getCouponChipRemove()?.addEventListener("click", (ev) => { 320 ev.preventDefault(); 321 ev.stopPropagation(); 322 this.removeCoupon(); 323 }); 324 } 325 applyCoupon() { 326 const code = this.getCouponInput().value?.trim(); 327 this.checkoutStore.coupons.currentCode.set(code); 328 if (!code) { 329 this.checkoutStore.coupons.errorMessage.set(this.checkoutCouponFormErrorTexts.blankDiscountCodeError); 330 this.checkoutStore.coupons.state.set(Checkout.CouponStates.ERROR); 331 return; 332 } 333 window.dispatchEvent(new CustomEvent("ON_APPLY_COUPON", { 334 detail: { isCouponValidation: true } 335 })); 336 } 337 enableCoupon() { 338 this.getCouponApplyButton().setAttribute("data-disabled", false); 339 this.getCouponInput().removeAttribute("disabled"); 340 } 341 disableCoupon() { 342 this.getCouponApplyButton().setAttribute("data-disabled", true); 343 this.getCouponInput().setAttribute("disabled", true); 344 } 345 updateLoader(isLoading) { 346 if (isLoading == void 0) { 347 isLoading = this.lastLoading; 348 } else { 349 this.lastLoading = isLoading; 350 } 351 this.getCouponButtonContainer().dataset.loading = isLoading; 352 } 353 setInputValue(value) { 354 const input = this.getCouponInput(); 355 value = value?.trim(); 356 if (value) { 357 input.value = value; 358 this.getCouponInputContainer().classList.add("hasValue"); 359 } else { 360 input.value = ""; 361 this.getCouponInputContainer().classList.remove("hasValue"); 362 } 363 } 364 setError(message) { 365 this.getCouponErrorContainer().innerHTML = message; 366 this.getCouponInputContainer().classList.add("elInputError"); 367 this.getCouponIconContainer().classList.add("elInputError"); 368 } 369 clearError() { 370 this.getCouponErrorContainer().innerHTML = ""; 371 this.getCouponInputContainer().classList.remove("elInputError"); 372 this.getCouponIconContainer().classList.remove("elInputError"); 373 } 374 getCouponInput() { 375 return this.element.querySelector("input"); 376 } 377 getCouponInputContainer() { 378 return this.element.querySelector(".elCheckoutCouponCodeInput,.elCheckoutCartCouponCodeInput"); 379 } 380 getCouponApplyButton() { 381 return this.element.querySelector('.elCheckoutCouponCodeButton a[href="#check-coupon-code"],.elCheckoutCartCouponCodeButton a[href="#check-coupon-code"]'); 382 } 383 getCouponButtonContainer() { 384 return this.element.querySelector(".elCheckoutCouponCodeButton,.elCheckoutCartCouponCodeButton"); 385 } 386 getCouponErrorContainer() { 387 return this.element.querySelector(".elCouponCodeError"); 388 } 389 getCouponIconContainer() { 390 return this.element.querySelector(".elCheckoutCouponFormWrapper,.elCheckoutCartCouponFormWrapper"); 391 } 392 getCouponAppliedContainer() { 393 return this.element.querySelector(".elCheckoutCouponApplied"); 394 } 395 getCouponChipCode() { 396 return this.element.querySelector(".elCheckoutCouponChipCode"); 397 } 398 getCouponChipRemove() { 399 return this.element.querySelector(".elCheckoutCouponChipRemove"); 400 } 401 showAppliedChip(code) { 402 const container = this.getCouponAppliedContainer(); 403 if (!container || !code) return; 404 this.getCouponChipCode().textContent = code; 405 container.removeAttribute("hidden"); 406 } 407 hideAppliedChip() { 408 const container = this.getCouponAppliedContainer(); 409 if (!container) return; 410 this.getCouponChipCode().textContent = ""; 411 container.setAttribute("hidden", ""); 412 } 413 removeCoupon() { 414 this.hideAppliedChip(); 415 this.setInputValue(""); 416 this.checkoutStore.coupons.currentCode.set(""); 417 this.checkoutStore.coupons.appliedCode.set(""); 418 this.enableCoupon(); 419 window.dispatchEvent(new CustomEvent("ON_CLEAR_COUPON")); 420 } 421}; 422registerComponent("CheckoutCouponForm/V1", CheckoutCouponFormV1); 423window["CheckoutCouponFormV1"] = CheckoutCouponFormV1; 424
425// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-order-summary-v1.ts 426init_define_process(); 427init_cf_utils(); 428init_Cart(); 429
430// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-utils.ts 431init_define_process(); 432function hasPhysicalProducts(cart) { 433 return cart.items.some(({ product_id, variant_id }) => { 434 const product = globalThis.globalResourceData.productsById[product_id]; 435 const variant = globalThis.globalResourceData.variantsById[variant_id]; 436 let productType = variant?.product_type; 437 productType = productType || product?.product_type; 438 return productType == "physical"; 439 }); 440} 441function setupOrderSummaries(component) { 442 const pageOrderSummaries = document.querySelector('[data-page-element="CheckoutOrderSummary/V1"].elCheckout'); 443 if (pageOrderSummaries) { 444 component.getComponents("CheckoutOrderSummary/V1").forEach((c) => { 445 c.element.style.display = "none"; 446 }); 447 } 448} 449function scrollToFirstVisibleError(el) { 450 const $errorWrapper = el ? $(el) : $('[data-error-container="active"]:visible:first').closest("[data-error-wrapper]"); 451 const $checkoutFormError = $(".elCheckoutFormErrors:visible:first"); 452 if ($errorWrapper.length > 0) { 453 $("html, body").stop(true, true).animate( 454 { 455 scrollTop: $errorWrapper.offset().top - 100 456 }, 457 500 458 ); 459 } else if ($checkoutFormError.length > 0) { 460 $("html, body").stop(true, true).animate( 461 { 462 scrollTop: $checkoutFormError.offset().top - 100 463 }, 464 500 465 ); 466 } 467} 468var pageElementContexts = [ 469 { selector: '[data-page-element="ModalContainer/V1"]', context: "Modal" }, 470 { selector: '[data-page-element="ContentNode"]', context: "ContentNode" } 471]; 472function getCheckoutContext(checkoutElement) { 473 let found; 474 pageElementContexts.find(({ selector }) => { 475 found = checkoutElement.closest(selector); 476 return found; 477 }); 478 return found; 479} 480function checkValidCustomFields(checkoutElement) { 481 const contextElement = getCheckoutContext(checkoutElement); 482 if (!contextElement) return true; 483 contextElement.querySelectorAll(".elFormItemWrapper:not(.elCheckoutInput)").forEach((el) => { 484 el.classList.remove("elInputError", "elInputWarning", "elInputValid"); 485 }); 486 const formItems = $(contextElement).find(".elFormItem.required1:not(.elCheckoutInput .elFormItem.required1):visible").toArray().filter( 487 (input) => !!input.getAttribute("data-custom-type") || input.getAttribute("type") == "checkbox" 488 ); 489 const results = []; 490 formItems.forEach((input) => { 491 const result = validateInput(input); 492 results.push(result); 493 let thisInput = $(input); 494 const parent = thisInput.parents(".elFormItemWrapper"); 495 thisInput = parent.length && parent.find(".inputHolder, .borderHolder, .elCheckbox").length ? parent.find(".inputHolder, .borderHolder, .elCheckbox") : thisInput; 496 if (result) { 497 thisInput.css("border-color", "#4a8920"); 498 thisInput.css("border-width", "3px"); 499 } else { 500 thisInput.css("border-color", "#B91517"); 501 thisInput.css("border-width", "3px"); 502 } 503 }); 504 return results.every((r) => !!r); 505} 506function buildCustomFields() { 507 const fields = {}; 508 document.querySelectorAll( 509 "[type='custom_type'], select[data-custom-type], [type='custom_type'] [type='checkbox']" 510 ).forEach((input) => { 511 fields[input.name] = input.type === "checkbox" ? input.checked : input.value; 512 }); 513 return fields; 514} 515function collectLeads(contactDetails) { 516 globalThis.CFDispatchEvent(globalThis.CFEvents.FORM_SUBMITTED, { contact: contactDetails }); 517 fetch("/user_pages/api/contacts", { 518 headers: { 519 Accept: "application/json", 520 "Content-Type": "application/json" 521 }, 522 method: "POST", 523 body: JSON.stringify(contactDetails) 524 }).then((response) => { 525 if (response.ok) { 526 globalThis.CFDispatchEvent(globalThis.CFEvents.FORM_SUBMITTED_OK, { contact: contactDetails }); 527 document.getElementById("cfAR")?.setAttribute("data-leads-collected", "true"); 528 } 529 }); 530} 531var AVAILABLE_KLARNA_COUNTRIES = [ 532 "AU", 533 "AT", 534 "BE", 535 "CA", 536 "CZ", 537 "DK", 538 "FI", 539 "FR", 540 "DE", 541 "IE", 542 "IT", 543 "MX", 544 "NL", 545 "NZ", 546 "NO", 547 "PL", 548 "PT", 549 "RO", 550 "SK", 551 "ES", 552 "SE", 553 "CH", 554 "GB", 555 "US" 556]; 557var numberOfStepsInCheckout = () => { 558 const element = document.querySelector(".elCheckout[data-total-steps]"); 559 return parseInt(element.dataset["totalSteps"], 10); 560}; 561
562// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-order-summary-v1.ts 563init_runtime(); 564var CheckoutOrderSummaryV1 = class extends CF2Component { 565 constructor(el, runtimeSel) { 566 super(el, runtimeSel); 567 } 568 initializeWithStore(store, checkoutComputed) { 569 this.checkoutStore = store; 570 [ 571 checkoutComputed.checkoutCart, 572 this.checkoutStore.summary 573 ].forEach((store2) => { 574 store2.listen(() => { 575 this.renderSummaryDetails(); 576 }); 577 }); 578 if (Checkout.store.payment) { 579 nanostores.computed([Checkout.store.payment?.type], (paymentType) => paymentType == "apple-pay").subscribe((isDigitalWalletPaymentType) => { 580 if (isDigitalWalletPaymentType && !this.couponFieldEnabled) { 581 this.hide(); 582 } else { 583 this.show(); 584 } 585 }); 586 } 587 this.renderSummaryDetails(); 588 Checkout.store.state.listen((state) => { 589 if (state === Checkout.StoreStates.FILLING_FORM) { 590 this.renderSummaryDetails(); 591 } 592 }); 593 if (globalResourceData.resourceName == "checkout" && this.mobileBehavior != null) { 594 closeOnClickOutside(this.element, () => { 595 addPageScroll(); 596 this.element.classList.remove("elOrderSummaryMobileOpen"); 597 }); 598 } 599 } 600 show() { 601 this.element.classList.remove("elHide"); 602 } 603 hide() { 604 this.element.classList.add("elHide"); 605 } 606 renderSummaryDetails() { 607 const summary = this.checkoutStore.summary.get(); 608 this.state = summary.state; 609 this.summary = !summary.data ? {} : summary.data; 610 const is_checkout_page = globalResourceData.resourceName == "checkout"; 611 const cart = is_checkout_page ? Cart.stores.cartData.get() : Checkout.computed.checkoutCart.get(); 612 this.hasPhysicalProducts = hasPhysicalProducts(cart); 613 const cartItems = cart.items; 614 this.items = cartItems.map(({ product_id, variant_id, price_id, quantity }) => { 615 const variant = Checkout.variantsById[variant_id]; 616 const price = Checkout.pricesById[price_id]; 617 const product = Checkout.productsById[product_id]; 618 const variantNamesArray = variant.property_value_ids.map((property_value_id) => { 619 return product.all_properties_values[property_value_id]; 620 }); 621 return { 622 productName: is_checkout_page ? product.name : variant.name, 623 image_url: variant.image ?? product.image, 624 priceName: price.name, 625 imageUrl: variant.image ?? variant.images?.[0] ?? product.image ?? product.images?.[0], 626 variantNames: variantNamesArray.length > 0 ? variantNamesArray.join(", ") : void 0, 627 quantity 628 }; 629 }); 630 let couponForm = this.getComponent("CheckoutCouponForm/V1"); 631 couponForm?.cleanup(this.checkoutStore); 632 const checkoutCouponFormErrorTexts = couponForm?.checkoutCouponFormErrorTexts; 633 this.render(true); 634 this.hydrate(); 635 couponForm = this.getComponent("CheckoutCouponForm/V1"); 636 if (couponForm) couponForm.checkoutCouponFormErrorTexts = checkoutCouponFormErrorTexts; 637 couponForm?.hydrate(this.checkoutStore); 638 } 639 hydrate() { 640 this.element.querySelector(".elOrderSummaryHead")?.addEventListener("click", (evt) => { 641 evt.preventDefault(); 642 this.open = !this.open; 643 this.renderSummaryDetails(); 644 }); 645 this.element.querySelector(".elOrderSummaryCouponClear")?.addEventListener("click", (evt) => { 646 evt.preventDefault(); 647 this.checkoutStore.coupons.currentCode.set(""); 648 this.checkoutStore.coupons.appliedCode.set(""); 649 const onClearCouponEvent = new CustomEvent("ON_CLEAR_COUPON"); 650 window.dispatchEvent(onClearCouponEvent); 651 }); 652 this.element.querySelector(".elOrderSummaryHeader")?.addEventListener("click", () => { 653 if (this.element.classList.contains("elOrderSummaryMobileOpen")) { 654 addPageScroll(); 655 this.element.classList.remove("elOrderSummaryMobileOpen"); 656 } else { 657 removePageScroll(); 658 this.element.classList.add("elOrderSummaryMobileOpen"); 659 } 660 }); 661 } 662 remove() { 663 this.element.innerHTML = ""; 664 } 665 render(initializeChildrenInstances = false) { 666 const is_server = true; 667 const couponFieldEnabled = this.couponFieldEnabled ?? null; 668 const open = this.open ?? null; 669 const state = this.state ?? "ok"; 670 const items = this.items ?? []; 671 const summary = this.summary ?? {}; 672 const hasPhysicalProducts2 = this.hasPhysicalProducts ?? false; 673 const billingFields = this.billingFields ?? null; 674 const shippingFields = this.shippingFields ?? null; 675 const mobileBehavior = this.mobileBehavior ?? null; 676 const summaryTexts = this.summaryTexts ?? null; 677 const linkWithCheckout = this.element.getAttribute("data-param-linkWithCheckout"); 678 const linkedCheckoutId = this.element.getAttribute("data-param-linkedCheckoutId"); 679 const checkoutCouponFormErrorTexts = this.element.getAttribute("data-param-checkoutCouponFormErrorTexts"); 680 let html = ""; 681 { 682 if (globalResourceData?.resourceName == "checkout") { 683 if (linkWithCheckout) { 684 html += `<div class="elCheckoutWrapper" ygg-render="replace">`; 685 if (linkWithCheckout == "true" || linkWithCheckout == true) { 686 html += `<div class="elCheckoutOuterFrame"></div>`; 687 } 688 const is_checkout_page = globalResourceData?.resourceName == "checkout"; 689 if (is_checkout_page) { 690 html += `<div class="elOrderSummaryHeader`; 691 if (CF2Blank(mobileBehavior) || CF2Blank(true)) { 692 html += ` forceHide`; 693 } 694 html += `"><div class="elOrderSummaryHeaderClosed"><div><span>${summaryTexts?.viewOrderSummary}</span><i class="fas fa-chevron-down"></i></div>`; 695 if (state == "ok") { 696 html += `<span class="elOrderSummaryHeaderTotal">`; 697 if (summary?.interim) { 698 html += `${summary?.interim?.formatted}`; 699 } else { 700 html += `${summary?.total?.formatted}`; 701 } 702 html += `</span>`;
703 } 704 html += `</div><div class="elOrderSummaryHeaderOpenned"><span>${summaryTexts?.closeOrderSummary}</span><i class="fas fa-chevron-up"></i></div></div>`; 705 html += `<div class="elOrderSummaryBody elCheckoutSummaryResource"><div class="elCartOrderSummaryItems">`; 706 const c0 = items; 707 const fl1 = new CF2ForloopDrop(c0.length); 708 for (const item of c0) { 709 const forloop = fl1; 710 html += `<div class="elCartOrderSummaryRow"><div class="elCartOrderSummaryRowLeft">`; 711 const imageUrl = item?.imageUrl; 712 html += `<div class="elCartOrderSummaryProductImageContainer `; 713 if (CF2Blank(imageUrl)) { 714 html += `elCartOrderSummaryEmptyImageContainer`; 715 } 716 html += `">`; 717 if (imageUrl) { 718 html += `<div data-page-element="Image/V2" class="elImageWrapper de-image-block id-Image/V2`; 719 if (CF2Blank(imageUrl) && CF2Blank(null) && true) { 720 html += ` forceHide`; 721 } 722 html += `" data-liquid-replace="item">`; 723 if (imageUrl || !CF2Blank(null)) { 724 html += `<img class="elImage" src="${imageUrl ?? null}" data-lazy-loading="true" data-lazy-loading="true"/>`; 725 } else if (false) { 726 html += `<div class="image-placeholder" title=""><span class="image-placeholder-header"></span></div>`; 727 } 728 html += `</div>`; 729 } 730 if (item?.quantity && item?.quantity > 0) { 731 html += `<div class="elCartOrderSummaryProductImageBadge">${item?.quantity}</div>`; 732 } 733 html += `</div><div class="elCartOrderSummaryRowLeftTextContainer"><div class="elCartOrderSummaryWithImageSubRow elOrderSummaryProductNameRow">${item?.productName}</div>`; 734 if (item?.variantNames) { 735 html += `<div class="elCartOrderSummaryWithImageSubRow elOrderSummaryProductDescriptionRow">${item?.variantNames}</div>`; 736 } 737 html += `</div></div><div class="elCartOrderSummaryRowRight"><span>${item?.priceName}</span></div></div>`; 738 forloop.next(); 739 } 740 html += `</div><div class="elOrderSummaryTotals">`; 741 if (couponFieldEnabled && couponFieldEnabled != "false") { 742 html += `<hr class="elCartOrderSummaryDivider"/>`; 743 html += `<div data-page-element="CheckoutCouponForm/V1" class="elCheckoutCouponFormContainer id-CheckoutCouponForm/V1" data-liquid-replace="item">`; 744 const is_checkout_page2 = globalResourceData?.resourceName == "checkout"; 745 if (is_checkout_page2) { 746 html += `<div class="elCheckoutCartCouponFormWrapper">`; 747 const inputText = summaryTexts?.coupon?.input ?? "Discount Code"; 748 const buttonText = summaryTexts?.coupon?.button ?? "Add"; 749 html += `<div data-page-element="Input/V1" class="elFormItemWrapper elInputWrapper de-input-block elCheckoutCartCouponCodeInput id-Input/V1 labelInside" data-content="" type="coupon_codes" data-liquid-replace="item"><input class="elFormItem elInput inputHolder " value="" type="text" name="coupon_codes" pattern="" autocomplete="" inputtype="" data-prevent-submit="" data-prevent-garlic="true" placeholder="${inputText}" maxlength=""/><div class="elLabel"><div class="borderHolder"></div><div class="borderHolder labelText"><label>${inputText}</label></div><div class="borderHolder"></div></div><div class="inputHolder" data-input-status-type="true" data-error-container="true"></div><div class="input-icon"><i class="fas fa-exclamation"></i></div></div><div class="elCheckoutCartCouponCodeButtonWrapper"><div data-page-element="Button/V1" class="elBTN elCheckoutCartCouponCodeButton id-Button/V1" data-liquid-replace="item">`; 750 const label_key = "checkcouponcode"; 751 const label_key_slice = "checkc"; 752 let data_content_key = ""; 753 data_content_key = "checkcouponcode"; 754 html += `<a target="_self" href="#check-coupon-code" class="elButton" aria-label="" data-disabled="false" data-show-button-ids="" data-hide-button-ids="" data-on-submit-go-to="" data-param-submittingText="Submitting..." data-content="" data-style-guide-button="" rel="noopener"><span class="elButtonMain"><i class="fas fa-spinner fa-spin elButtonSpinner elButtonText"></i><span class="elButtonMainText elButtonText">${buttonText}</span></span><span class="elButtonSub"></span></a></div><span class="elCheckoutCouponCodeButtonLoading"><i style="margin:0px 10px;" class="fas fa-spinner fa-spin"></i></span></div></div>`; 755 } else { 756 html += `<div class="elCheckoutCouponFormWrapper">`; 757 const inputText = summaryTexts?.coupon?.input ?? "Enter Coupon"; 758 const buttonText = summaryTexts?.coupon?.button ?? "Apply"; 759 html += `<i data-page-element="IconNode" class="fa-fw fa_icon fa_prepe
759nded elCheckoutCouponTagIcon fa fa-tag id-IconNode"></i><div data-page-element="Input/V1" class="elFormItemWrapper elInputWrapper de-input-block elCheckoutCouponCodeInput id-Input/V1 labelInside" data-content="" type="coupon_codes" data-liquid-replace="item"><input class="elFormItem elInput inputHolder " value="" type="text" name="coupon_codes" pattern="" autocomplete="" inputtype="" data-prevent-submit="" data-prevent-garlic="true" placeholder="${inputText}" maxlength=""/><div class="elLabel"><div class="borderHolder"></div><div class="borderHolder labelText"><label>${inputText}</label></div><div class="borderHolder"></div></div><div class="inputHolder" data-input-status-type="true" data-error-container="true"></div><div class="input-icon"><i class="fas fa-exclamation"></i></div></div><div class="elCheckoutCouponCodeButtonWrapper"><div data-page-element="Button/V1" class="elBTN elCheckoutCouponCodeButton id-Button/V1" data-liquid-replace="item">`; 760 const label_key = "checkcouponcode"; 761 const label_key_slice = "checkc"; 762 let data_content_key = ""; 763 data_content_key = "checkcouponcode"; 764 html += `<a target="_self" href="#check-coupon-code" class="elButton" aria-label="" data-disabled="false" data-show-button-ids="" data-hide-button-ids="" data-on-submit-go-to="" data-param-submittingText="Submitting..." data-content="" data-style-guide-button="" rel="noopener"><span class="elButtonMain"><i class="fas fa-spinner fa-spin elButtonSpinner elButtonText"></i><span class="elButtonMainText elButtonText">${buttonText}</span></span><span class="elButtonSub"></span></a></div><span class="elCheckoutCouponCodeButtonLoading"><i style="margin:0px 10px;" class="fas fa-spinner fa-spin"></i></span></div></div>`; 765 } 766 html += `<paragraph-v1 class="elCouponCodeError"></paragraph-v1><div class="elCheckoutCouponApplied" hidden="true"><span class="elCheckoutCouponChip"><i class="fas fa-tag elCheckoutCouponChipIcon"></i><span class="elCheckoutCouponChipCode"></span><button type="button" class="elCheckoutCouponChipRemove" aria-label="${summaryTexts?.coupon?.remove ?? "Remove c
766oupon"}"><i class="fas fa-times"></i></button></span></div></div>`; 767 } 768 html += `<hr class="elCartOrderSummaryDivider"/><div class="elOrderSummaryRow"><div class="elOrderSummaryRowLeft">${summaryTexts?.subtotal}</div><div class="elOrderSummaryRowRight">`; 769 if (summary?.subtotal) { 770 html += `${summary?.subtotal?.formatted}`; 771 } else { 772 html += `--`; 773 } 774 html += `</div></div>`; 775 if (summary?.discount && summary?.discount?.amount > 0 && summary?.discounts?.length > 0) { 776 const c2 = summary.discounts; 777 const fl3 = new CF2ForloopDrop(c2.length); 778 for (const discount of c2) { 779 const forloop = fl3; 780 html += `<div class="elOrderSummaryRow elOrderSummaryDiscountRow"><div class="elOrderSummaryRowLeft">${summaryTexts?.discount} `; 781 if (discount?.code) { 782 html += `(`; 783 html += `${discount?.code})`; 784 } 785 html += `<span class="elOrderSummaryCouponClear">X</span></div><div class="elOrderSummaryRowRight">${summary?.discount?.formatted}</div></div>`; 786 forloop.next(); 787 } 788 } 789 if (hasPhysicalProducts2) { 790 html += `<div class="elOrderSummaryRow"><div class="elOrderSummaryRowLeft">${summaryTexts?.shipping}</div><div class="elOrderSummaryRowRight">`; 791 if (CF2Blank(summary) || CF2Blank(summary?.shipping) || CF2Blank(summary?.shipping?.amount)) { 792 html += `${summaryTexts?.waitingForAddress}`; 793 } else if (summary?.shipping?.amount > 0) { 794 html += `${summary?.shipping?.formatted}`; 795 } else { 796 html += `${summaryTexts?.free}`; 797 } 798 html += `</div></div>`; 799 } 800 html += `<hr class="elCartOrderSummaryDivider"/><div class="elOrderSummaryRow"><div class="elCartOrderSummaryRowLeftTextContainer"><div class="elCartOrderSummarySubRow elCartOrderSummarySubRowTotalText">${summaryTexts?.total}</div>`; 801 if (summary?.tax && summary?.tax?.amount > 0) { 802 html += `<div class="elCartOrderSummarySubRow elCartOrderSummarySubRowTaxesText">${summaryTexts?.including} ${summary?.tax?.formatted} ${summaryTexts?.inTaxes}</div>`; 803 } 804 html += `</div><div class="elCartOrderSummaryRowRight"><span class="elCartOrderSummarySubRowTotalPrice">`; 805 if (summary?.interim) { 806 html += `${summary?.interim?.formatted}`; 807 } else { 808 if (summary?.total) { 809 html += `${summary?.total?.formatted}`; 810 } else { 811 html += `--`; 812 } 813 } 814 html += `</span></div></div>`; 815 if (summary?.recurring && summary?.recurring?.showThen) { 816 html += `<div class="elOrderSummaryRow elOrderSummaryRecurringRow"><div class="elCartOrderSummaryRowLeftTextContainer"><div class="elCartOrderSummarySubRow">${summaryTexts?.then}</div></div><div class="elCartOrderSummaryRowRight">`; 817 if (summary?.recurring?.discount?.amount > 0) { 818 html += `<span class="elOrderSummaryRecurringStrikethrough">${summary?.recurring?.before_formatted}</span>`; 819 } 820 html += `${summary?.recurring?.total?.formatted}${summary?.recurring?.interval}</div></div>`; 821 } 822 html += `</div></div>`; 823 } else { 824 html += `<div class="elOrderSummaryHead"><div class="elOrderSummaryRow"><div class="elOrderSummaryRowLeft"><i class="fa fa-shopping-basket"></i><span class="elOrderSummaryHeadText">${summaryTexts?.title}</span></div><div class="elOrderSummaryRowRight">`; 825 if (state == "waiting") { 826 html += `<span> ${summaryTexts?.details} <i style="margin:0px 10px;" class="fas fa-spinner fa-spin"></i></span>`; 827 } else if (state == "calculating") { 828 html += `<span> ${summaryTexts?.calculating} <i style="margin:0px 10px;" class="fas fa-spinner fa-spin"></i></span>`;
829 } else if (state == "error") { 830 html += `<span> ${summaryTexts?.error} <i style="margin:0px 10px;" class="fas fa-spinner fa-spin"></i></span>`; 831 } 832 if (open) { 833 html += `<i class="fas fa-chevron-up elOrderSummaryToggleable"></i>`; 834 } else { 835 if (state == "ok") { 836 html += `<span class="elOrderSummaryTotalPrice">`; 837 if (summary?.interim) { 838 html += `${summary?.interim?.formatted}`; 839 } else { 840 html += `${summary?.total?.formatted}`; 841 } 842 html += `</span>`; 843 } 844 html += `<i class="fas fa-chevron-down elOrderSummaryToggleable"></i>`; 845 } 846 html += `</div></div></div>`; 847 if (open) { 848 if (couponFieldEnabled && couponFieldEnabled != "false") { 849 html += `<div data-page-element="CheckoutCouponForm/V1" class="elCheckoutCouponFormContainer id-CheckoutCouponForm/V1" data-liquid-replace="item">`; 850 const is_checkout_page2 = globalResourceData?.resourceName == "checkout"; 851 if (is_checkout_page2) { 852 html += `<div class="elCheckoutCartCouponFormWrapper">`; 853 const inputText = summaryTexts?.coupon?.input ?? "Discount Code"; 854 const buttonText = summaryTexts?.coupon?.button ?? "Add"; 855 html += `<div data-page-element="Input/V1" class="elFormItemWrapper elInputWrapper de-input-block elCheckoutCartCouponCodeInput id-Input/V1 labelInside" data-content="" type="coupon_codes" data-liquid-replace="item"><input class="elFormItem elInput inputHolder " value="" type="text" name="coupon_codes" pattern="" autocomplete="" inputtype="" data-prevent-submit="" data-prevent-garlic="true" placeholder="${inputText}" maxlength=""/><div class="elLabel"><div class="borderHolder"></div><div class="borderHolder labelText"><label>${inputText}</label></div><div class="borderHolder"></div></div><div class="inputHolder" data-input-status-type="true" data-error-container="true"></div><div class="input-icon"><i class="fas fa-exclamation"></i></div></div><div class="elCheckoutCartCouponCodeButtonWrapper"><div data-page-element="Button/V1" class="elBTN elCheckoutCartCouponCodeButton id-Button/V1" data-liquid-replace="item">`; 856 const label_key = "checkcouponcode"; 857 const label_key_slice = "checkc"; 858 let data_content_key = ""; 859 data_content_key = "checkcouponcode"; 860 html += `<a target="_self" href="#check-coupon-code" class="elButton" aria-label="" data-disabled="false" data-show-button-ids="" data-hide-button-ids="" data-on-submit-go-to="" data-param-submittingText="Submitting..." data-content="" data-style-guide-button="" rel="noopener"><span class="elButtonMain"><i class="fas fa-spinner fa-spin elButtonSpinner elButtonText"></i><span class="elButtonMainText elButtonText">${buttonText}</span></span><span class="elButtonSub"></span></a></div><span class="elCheckoutCouponCodeButtonLoading"><i style="margin:0px 10px;" class="fas fa-spinner fa-spin"></i></span></div></div>`; 861 } else { 862 html += `<div class="elCheckoutCouponFormWrapper">`; 863 const inputText = summaryTexts?.coupon?.input ?? "Enter Coupon"; 864 const buttonText = summaryTexts?.coupon?.button ?? "Apply"; 865 html += `<i data-page-element="IconNode" class="fa-fw fa_icon fa_prepended elCheckoutCouponTagIcon fa fa-tag id-IconNode"></i><div data-page-element="Input/V1" class="elFormItemWrapper elInputWrapper de-input-block elCheckoutCouponCodeInput id-Input/V1 labelInside" data-content="" type="coupon_codes" data-liquid-replace="item"><input class="elFormItem elInput inputHolder " value="" type="text" name="coupon_codes" pattern="" autocomplete="" inputtype="" data-prevent-submit="" data-prevent-garlic="true" placeholder="${inputText}" maxlength=""/><div class="elLabel"><div class="borderHolder"></div><div class="borderHolder labelText"><label>${inputText}</label></div><div class="borderHolder"></div></div><div class="inputHolder" data-input-status-type="true" data-error-container="true"></div><div class="input-icon"><i class="fas fa-exclamation"></i></div></div><div class="elCheckoutCouponCodeButtonWrapper"><div data-page-element="Button/V1" class="elBTN elCheckoutCouponCodeButton i
865d-Button/V1" data-liquid-replace="item">`; 866 const label_key = "checkcouponcode"; 867 const label_key_slice = "checkc"; 868 let data_content_key = ""; 869 data_content_key = "checkcouponcode"; 870 html += `<a target="_self" href="#check-coupon-code" class="elButton" aria-label="" data-disabled="false" data-show-button-ids="" data-hide-button-ids="" data-on-submit-go-to="" data-param-submittingText="Submitting..." data-content="" data-style-guide-button="" rel="noopener"><span class="elButtonMain"><i class="fas fa-spinner fa-spin elButtonSpinner elButtonText"></i><span class="elButtonMainText elButtonText">${buttonText}</span></span><span class="elButtonSub"></span></a></div><span class="elCheckoutCouponCodeButtonLoading"><i style="margin:0px 10px;" class="fas fa-spinner fa-spin"></i></span></div></div>`; 871 } 872 html += `<paragraph-v1 class="elCouponCodeError"></paragraph-v1><div class="elCheckoutCouponApplied" hidden="true"><span class="elCheckoutCouponChip"><i class="fas fa-tag elCheckoutCouponChipIcon"></i><span class="elCheckoutCouponChipCode"></span><button type="button" class="elCheckoutCouponChipRemove" aria-label="${summaryTexts?.coupon?.remove ?? "Remove c
872oupon"}"><i class="fas fa-times"></i></button></span></div></div>`; 873 } 874 html += `<div class="elOrderSummaryBody">`; 875 const c4 = items; 876 const fl5 = new CF2ForloopDrop(c4.length); 877 for (const item of c4) { 878 const forloop = fl5; 879 html += `<div class="elOrderSummaryRow"><div class="elOrderSummaryRowLeft">${item?.productName}</div><div class="elOrderSummaryRowRight">`; 880 if (item?.quantity && item?.quantity > 1) { 881 html += `<span class="elOrderSummaryQuantity">${summaryTexts?.qty} ${item?.quantity}</span>`; 882 } 883 html += `<span>${item?.priceName}</span></div></div>`; 884 forloop.next(); 885 } 886 if (state == "ok") { 887 if (summary?.upcoming_invoice && summary?.upcoming_invoice?.line_items?.length) { 888 html += `<hr class="elOrderSummaryDivider"/>`; 889 const c6 = summary.upcoming_invoice.line_items; 890 const fl7 = new CF2ForloopDrop(c6.length); 891 for (const item of c6) { 892 const forloop = fl7; 893 html += `<div class="elOrderSummaryRow"><div class="elOrderSummaryRowLeft">${item?.variant_name}</div><div class="elOrderSummaryRowRight">`; 894 if (item?.quantity && item?.quantity > 1) { 895 html += `<span class="elOrderSummaryQuantity">${summaryTexts?.qty} ${item?.quantity}</span>`; 896 } 897 html += `<span>${item?.formatted}</span></div></div>`; 898 forloop.next(); 899 } 900 } 901 html += `<hr class="elOrderSummaryDivider"/>`; 902 html += `<div class="elOrderSummaryRow"><div class="elOrderSummaryRowLeft">${summaryTexts?.taxes}</div><div class="elOrderSummaryRowRight">`; 903 if (summary?.tax?.formatted && summary?.shipping?.amount >= 0) { 904 html += `${summary?.tax?.formatted}`; 905 } else { 906 html += ` -- `; 907 } 908 html += `</div></div>`; 909 if (summary?.discount?.amount > 0 && summary?.discounts?.length > 0) { 910 const c8 = summary.discounts; 911 const fl9 = new CF2ForloopDrop(c8.length); 912 for (const discount of c8) { 913 const forloop = fl9; 914 html += `<div class="elOrderSummaryRow elOrderSummaryDiscountRow"><div class="elOrderSummaryRowLeft">${summaryTexts?.discount} `; 915 if (discount?.code) { 916 html += `(`; 917 html += `${discount?.code})`; 918 } 919 html += `<span class="elOrderSummaryCouponClear">X</span></div><div class="elOrderSummaryRowRight">${summary?.discount?.formatted}</div></div>`; 920 forloop.next(); 921 } 922 } 923 if (hasPhysicalProducts2) { 924 html += `<div class="elOrderSummaryRow"><div class="elOrderSummaryRowLeft">${summaryTexts?.shipping}</div><div class="elOrderSummaryRowRight">`; 925 if (summary?.shipping?.amount > 0) { 926 html += `${summary?.shipping?.formatted}`; 927 } else if (summary?.shipping?.amount <= 0) { 928 html += `${summaryTexts?.free}`; 929 } else { 930 html += ` -- `; 931 } 932 html += `</div></div>`; 933 } 934 html += `<hr class="elOrderSummaryDivider"/>`; 935 html += `<div class="elOrderSummaryRow"><div class="elOrderSummaryRowLeft">${summaryTexts?.total}`; 936 if (summary?.next_invoice_date) { 937 html += ` - `; 938 html += `<span class="elOrderSummaryNextInvoice"> ${summaryTexts?.dueOn} ${summary?.next_invoice_date}</span>`; 939 } 940 html += `</div><div class="elOrderSummaryRowRight"><span class="elOrderSummaryTotalPrice">`; 941 if (summary?.interim) { 942 html += `${summary?.interim?.formatted}`; 943 } else { 944 html += `${summary?.total?.formatted}`; 945 } 946 html += `</span></div></div>`; 947 if (summary?.recurring && summary?.recurring?.showThen) { 948 html += `<div class="elOrderSummaryRow elOrderSummaryRecurringRow"><div class="elOrderSummaryRowLeft">${summaryTexts?.then}</div><div class="elOrderSummaryRowRight">`; 949 if (summary?.recurring?.discount?.amount > 0) { 950 html += `<span class="elOrderSummaryRecurringStrikethrough">${summary?.recurring?.before_formatted}</span>`;
951 } 952 html += `${summary?.recurring?.total?.formatted}${summary?.recurring?.interval}</div></div>`; 953 } 954 } 955 html += `</div>`; 956 } 957 } 958 html += `</div>`; 959 } 960 } else { 961 html += `<div class="elCheckoutWrapper" ygg-render="replace">`; 962 if (linkWithCheckout == "true" || linkWithCheckout == true) { 963 html += `<div class="elCheckoutOuterFrame"></div>`; 964 } 965 const is_checkout_page = globalResourceData?.resourceName == "checkout"; 966 if (is_checkout_page) { 967 html += `<div class="elOrderSummaryHeader`; 968 if (CF2Blank(mobileBehavior) || CF2Blank(true)) { 969 html += ` forceHide`; 970 } 971 html += `"><div class="elOrderSummaryHeaderClosed"><div><span>${summaryTexts?.viewOrderSummary}</span><i class="fas fa-chevron-down"></i></div>`; 972 if (state == "ok") { 973 html += `<span class="elOrderSummaryHeaderTotal">`; 974 if (summary?.interim) { 975 html += `${summary?.interim?.formatted}`; 976 } else { 977 html += `${summary?.total?.formatted}`; 978 } 979 html += `</span>`; 980 } 981 html += `</div><div class="elOrderSummaryHeaderOpenned"><span>${summaryTexts?.closeOrderSummary}</span><i class="fas fa-chevron-up"></i></div></div>`; 982 html += `<div class="elOrderSummaryBody elCheckoutSummaryResource"><div class="elCartOrderSummaryItems">`; 983 const c10 = items; 984 const fl11 = new CF2ForloopDrop(c10.length); 985 for (const item of c10) { 986 const forloop = fl11; 987 html += `<div class="elCartOrderSummaryRow"><div class="elCartOrderSummaryRowLeft">`; 988 const imageUrl = item?.imageUrl; 989 html += `<div class="elCartOrderSummaryProductImageContainer `; 990 if (CF2Blank(imageUrl)) { 991 html += `elCartOrderSummaryEmptyImageContainer`; 992 } 993 html += `">`; 994 if (imageUrl) { 995 html += `<div data-page-element="Image/V2" class="elImageWrapper de-image-block id-Image/V2`; 996 if (CF2Blank(imageUrl) && CF2Blank(null) && true) { 997 html += ` forceHide`; 998 } 999 html += `" data-liquid-replace="item">`; 1000 if (imageUrl || !CF2Blank(null)) { 1001 html += `<img class="elImage" src="${imageUrl ?? null}" data-lazy-loading="true" data-lazy-loading="true"/>`; 1002 } else if (false) { 1003 html += `<div class="image-placeholder" title=""><span class="image-placeholder-header"></span></div>`; 1004 } 1005 html += `</div>`; 1006 } 1007 if (item?.quantity && item?.quantity > 0) { 1008 html += `<div class="elCartOrderSummaryProductImageBadge">${item?.quantity}</div>`; 1009 } 1010 html += `</div><div class="elCartOrderSummaryRowLeftTextContainer"><div class="elCartOrderSummaryWithImageSubRow elOrderSummaryProductNameRow">${item?.productName}</div>`; 1011 if (item?.variantNames) { 1012 html += `<div class="elCartOrderSummaryWithImageSubRow elOrderSummaryProductDescriptionRow">${item?.variantNames}</div>`; 1013 } 1014 html += `</div></div><div class="elCartOrderSummaryRowRight"><span>${item?.priceName}</span></div></div>`; 1015 forloop.next(); 1016 } 1017 html += `</div><div class="elOrderSummaryTotals">`; 1018 if (couponFieldEnabled && couponFieldEnabled != "false") { 1019 html += `<hr class="elCartOrderSummaryDivider"/>`; 1020 html += `<div data-page-element="CheckoutCouponForm/V1" class="elCheckoutCouponFormContainer id-CheckoutCouponForm/V1" data-liquid-replace="item">`; 1021 const is_checkout_page2 = globalResourceData?.resourceName == "checkout"; 1022 if (is_checkout_page2) { 1023 html += `<div class="elCheckoutCartCouponFormWrapper">`; 1024 const inputText = summaryTexts?.coupon?.input ?? "Discount Code"; 1025 const buttonText = summaryTexts?.coupon?.button ?? "Add"; 1026 html += `<div data-page-element="Input/V1" class="elFormItemWrapper elInputWrapper de-input-block elCheckoutCartCouponCodeInput id-Input/V1 labelInside" data-content="" type="coupon_codes" data-liquid-replace="item"><input class="elFormItem elInput inputHolder " value="" type="text" name="coupon_codes" pattern="" autocomplete="" inputtype="" data-prevent-submit="" data-prevent-garlic="true" placeholder="${inputText}" maxlength=""/><div class="elLabel"><div class="borderHolder"></div><div class="borderHolder labelText"><label>${inputText}</label></div><div class="borderHolder"></div></div><div class="inputHolder" data-input-status-type="true" data-error-container="true"></div><div class="input-icon"><i class="fas fa-exclamation"></i></div></div><div class="elCheckoutCartCouponCodeButtonWrapper"><div data-page-element="Button/V1" class="elBTN elCheckoutCartCouponCodeButton i
1026d-Button/V1" data-liquid-replace="item">`; 1027 const label_key = "checkcouponcode"; 1028 const label_key_slice = "checkc"; 1029 let data_content_key = ""; 1030 data_content_key = "checkcouponcode"; 1031 html += `<a target="_self" href="#check-coupon-code" class="elButton" aria-label="" data-disabled="false" data-show-button-ids="" data-hide-button-ids="" data-on-submit-go-to="" data-param-submittingText="Submitting..." data-content="" data-style-guide-button="" rel="noopener"><span class="elButtonMain"><i class="fas fa-spinner fa-spin elButtonSpinner elButtonText"></i><span class="elButtonMainText elButtonText">${buttonText}</span></span><span class="elButtonSub"></span></a></div><span class="elCheckoutCouponCodeButtonLoading"><i style="margin:0px 10px;" class="fas fa-spinner fa-spin"></i></span></div></div>`; 1032 } else { 1033 html += `<div class="elCheckoutCouponFormWrapper">`; 1034 const inputText = summaryTexts?.coupon?.input ?? "Enter Coupon"; 1035 const buttonText = summaryTexts?.coupon?.button ?? "Apply"; 1036 html += `<i data-page-element="IconNode" class="fa-fw fa_icon fa_prepended elCheckoutCouponTagIcon fa fa-tag id-IconNode"></i><div data-page-element="Input/V1" class="elFormItemWrapper elInputWrapper de-input-block elCheckoutCouponCodeInput id-Input/V1 labelInside" data-content="" type="coupon_codes" data-liquid-replace="item"><input class="elFormItem elInput inputHolder " value="" type="text" name="coupon_codes" pattern="" autocomplete="" inputtype="" data-prevent-submit="" data-prevent-garlic="true" placeholder="${inputText}" maxlength=""/><div class="elLabel"><div class="borderHolder"></div><div class="borderHolder labelText"><label>${inputText}</label></div><div class="borderHolder"></div></div><div class="inputHolder" data-input-status-type="true" data-error-container="true"></div><div class="input-icon"><i class="fas fa-exclamation"></i></div></div><div class="elCheckoutCouponCodeButtonWrapper"><div data-page-element="Button/V1" class="elBTN elCheckoutCouponCodeButton id-Button/V1" data-liquid-replace="item">`; 1037 const label_key = "checkcouponcode"; 1038 const label_key_slice = "checkc"; 1039 let data_content_key = ""; 1040 data_content_key = "checkcouponcode"; 1041 html += `<a target="_self" href="#check-coupon-code" class="elButton" aria-label="" data-disabled="false" data-show-button-ids="" data-hide-button-ids="" data-on-submit-go-to="" data-param-submittingText="Submitting..." data-content="" data-style-guide-button="" rel="noopener"><span class="elButtonMain"><i class="fas fa-spinner fa-spin elButtonSpinner elButtonText"></i><span class="elButtonMainText elButtonText">${buttonText}</span></span><span class="elButtonSub"></span></a></div><span class="elCheckoutCouponCodeButtonLoading"><i style="margin:0px 10px;" class="fas fa-spinner fa-spin"></i></span></div></div>`; 1042 } 1043 html += `<paragraph-v1 class="elCouponCodeError"></paragraph-v1><div class="elCheckoutCouponApplied" hidden="true"><span class="elCheckoutCouponChip"><i class="fas fa-tag elCheckoutCouponChipIcon"></i><span class="elCheckoutCouponChipCode"></span><button type="button" class="elCheckoutCouponChipRemove" aria-label="${summaryTexts?.coupon?.remove ?? "Remove c
1043oupon"}"><i class="fas fa-times"></i></button></span></div></div>`; 1044 } 1045 html += `<hr class="elCartOrderSummaryDivider"/><div class="elOrderSummaryRow"><div class="elOrderSummaryRowLeft">${summaryTexts?.subtotal}</div><div class="elOrderSummaryRowRight">`; 1046 if (summary?.subtotal) { 1047 html += `${summary?.subtotal?.formatted}`; 1048 } else { 1049 html += `--`; 1050 } 1051 html += `</div></div>`; 1052 if (summary?.discount && summary?.discount?.amount > 0 && summary?.discounts?.length > 0) { 1053 const c12 = summary.discounts; 1054 const fl13 = new CF2ForloopDrop(c12.length); 1055 for (const discount of c12) { 1056 const forloop = fl13; 1057 html += `<div class="elOrderSummaryRow elOrderSummaryDiscountRow"><div class="elOrderSummaryRowLeft">${summaryTexts?.discount} `; 1058 if (discount?.code) { 1059 html += `(`; 1060 html += `${discount?.code})`; 1061 } 1062 html += `<span class="elOrderSummaryCouponClear">X</span></div><div class="elOrderSummaryRowRight">${summary?.discount?.formatted}</div></div>`; 1063 forloop.next(); 1064 } 1065 } 1066 if (hasPhysicalProducts2) { 1067 html += `<div class="elOrderSummaryRow"><div class="elOrderSummaryRowLeft">${summaryTexts?.shipping}</div><div class="elOrderSummaryRowRight">`; 1068 if (CF2Blank(summary) || CF2Blank(summary?.shipping) || CF2Blank(summary?.shipping?.amount)) { 1069 html += `${summaryTexts?.waitingForAddress}`; 1070 } else if (summary?.shipping?.amount > 0) { 1071 html += `${summary?.shipping?.formatted}`; 1072 } else { 1073 html += `${summaryTexts?.free}`; 1074 } 1075 html += `</div></div>`; 1076 } 1077 html += `<hr class="elCartOrderSummaryDivider"/><div class="elOrderSummaryRow"><div class="elCartOrderSummaryRowLeftTextContainer"><div class="elCartOrderSummarySubRow elCartOrderSummarySubRowTotalText">${summaryTexts?.total}</div>`; 1078 if (summary?.tax && summary?.tax?.amount > 0) { 1079 html += `<div class="elCartOrderSummarySubRow elCartOrderSummarySubRowTaxesText">${summaryTexts?.including} ${summary?.tax?.formatted} ${summaryTexts?.inTaxes}</div>`; 1080 } 1081 html += `</div><div class="elCartOrderSummaryRowRight"><span class="elCartOrderSummarySubRowTotalPrice">`; 1082 if (summary?.interim) { 1083 html += `${summary?.interim?.formatted}`; 1084 } else { 1085 if (summary?.total) { 1086 html += `${summary?.total?.formatted}`; 1087 } else { 1088 html += `--`; 1089 } 1090 } 1091 html += `</span></div></div>`; 1092 if (summary?.recurring && summary?.recurring?.showThen) { 1093 html += `<div class="elOrderSummaryRow elOrderSummaryRecurringRow"><div class="elCartOrderSummaryRowLeftTextContainer"><div class="elCartOrderSummarySubRow">${summaryTexts?.then}</div></div><div class="elCartOrderSummaryRowRight">`; 1094 if (summary?.recurring?.discount?.amount > 0) { 1095 html += `<span class="elOrderSummaryRecurringStrikethrough">${summary?.recurring?.before_formatted}</span>`; 1096 } 1097 html += `${summary?.recurring?.total?.formatted}${summary?.recurring?.interval}</div></div>`; 1098 } 1099 html += `</div></div>`; 1100 } else { 1101 html += `<div class="elOrderSummaryHead"><div class="elOrderSummaryRow"><div class="elOrderSummaryRowLeft"><i class="fa fa-shopping-basket"></i><span class="elOrderSummaryHeadText">${summaryTexts?.title}</span></div><div class="elOrderSummaryRowRight">`; 1102 if (state == "waiting") { 1103 html += `<span> ${summaryTexts?.details} <i style="margin:0px 10px;" class="fas fa-spinner fa-spin"></i></span>`; 1104 } else if (state == "calculating") { 1105 html += `<span> ${summaryTexts?.calculating} <i style="margin:0px 10px;" class="fas fa-spinner fa-spin"></i></span>`; 1106 } else if (state == "error") { 1107 html += `<span> ${summaryTexts?.error} <i style="margin:0px 10px;" class="fas fa-spinner fa-spin"></i></span>`;
1108 } 1109 if (open) { 1110 html += `<i class="fas fa-chevron-up elOrderSummaryToggleable"></i>`; 1111 } else { 1112 if (state == "ok") { 1113 html += `<span class="elOrderSummaryTotalPrice">`; 1114 if (summary?.interim) { 1115 html += `${summary?.interim?.formatted}`; 1116 } else { 1117 html += `${summary?.total?.formatted}`; 1118 } 1119 html += `</span>`; 1120 } 1121 html += `<i class="fas fa-chevron-down elOrderSummaryToggleable"></i>`; 1122 } 1123 html += `</div></div></div>`; 1124 if (open) { 1125 if (couponFieldEnabled && couponFieldEnabled != "false") { 1126 html += `<div data-page-element="CheckoutCouponForm/V1" class="elCheckoutCouponFormContainer id-CheckoutCouponForm/V1" data-liquid-replace="item">`; 1127 const is_checkout_page2 = globalResourceData?.resourceName == "checkout"; 1128 if (is_checkout_page2) { 1129 html += `<div class="elCheckoutCartCouponFormWrapper">`; 1130 const inputText = summaryTexts?.coupon?.input ?? "Discount Code"; 1131 const buttonText = summaryTexts?.coupon?.button ?? "Add"; 1132 html += `<div data-page-element="Input/V1" class="elFormItemWrapper elInputWrapper de-input-block elCheckoutCartCouponCodeInput id-Input/V1 labelInside" data-content="" type="coupon_codes" data-liquid-replace="item"><input class="elFormItem elInput inputHolder " value="" type="text" name="coupon_codes" pattern="" autocomplete="" inputtype="" data-prevent-submit="" data-prevent-garlic="true" placeholder="${inputText}" maxlength=""/><div class="elLabel"><div class="borderHolder"></div><div class="borderHolder labelText"><label>${inputText}</label></div><div class="borderHolder"></div></div><div class="inputHolder" data-input-status-type="true" data-error-container="true"></div><div class="input-icon"><i class="fas fa-exclamation"></i></div></div><div class="elCheckoutCartCouponCodeButtonWrapper"><div data-page-element="Button/V1" class="elBTN elCheckoutCartCouponCodeButton id-Button/V1" data-liquid-replace="item">`; 1133 const label_key = "checkcouponcode"; 1134 const label_key_slice = "checkc"; 1135 let data_content_key = ""; 1136 data_content_key = "checkcouponcode"; 1137 html += `<a target="_self" href="#check-coupon-code" class="elButton" aria-label="" data-disabled="false" data-show-button-ids="" data-hide-button-ids="" data-on-submit-go-to="" data-param-submittingText="Submitting..." data-content="" data-style-guide-button="" rel="noopener"><span class="elButtonMain"><i class="fas fa-spinner fa-spin elButtonSpinner elButtonText"></i><span class="elButtonMainText elButtonText">${buttonText}</span></span><span class="elButtonSub"></span></a></div><span class="elCheckoutCouponCodeButtonLoading"><i style="margin:0px 10px;" class="fas fa-spinner fa-spin"></i></span></div></div>`; 1138 } else { 1139 html += `<div class="elCheckoutCouponFormWrapper">`; 1140 const inputText = summaryTexts?.coupon?.input ?? "Enter Coupon"; 1141 const buttonText = summaryTexts?.coupon?.button ?? "Apply"; 1142 html += `<i data-page-element="IconNode" class="fa-fw fa_icon fa_prepended elCheckoutCouponTagIcon fa fa-tag id-IconNode"></i><div data-page-element="Input/V1" class="elFormItemWrapper elInputWrapper de-input-block elCheckoutCouponCodeInput id-Input/V1 labelInside" data-content="" type="coupon_codes" data-liquid-replace="item"><input class="elFormItem elInput inputHolder " value="" type="text" name="coupon_codes" pattern="" autocomplete="" inputtype="" data-prevent-submit="" data-prevent-garlic="true" placeholder="${inputText}" maxlength=""/><div class="elLabel"><div class="borderHolder"></div><div class="borderHolder labelText"><label>${inputText}</label></div><div class="borderHolder"></div></div><div class="inputHolder" data-input-status-type="true" data-error-container="true"></div><div class="input-icon"><i class="fas fa-exclamation"></i></div></div><div class="elCheckoutCouponCodeButtonWrapper"><div data-page-element="Button/V1" class="elBTN elCheckoutCouponCodeButton i
1142d-Button/V1" data-liquid-replace="item">`; 1143 const label_key = "checkcouponcode"; 1144 const label_key_slice = "checkc"; 1145 let data_content_key = ""; 1146 data_content_key = "checkcouponcode"; 1147 html += `<a target="_self" href="#check-coupon-code" class="elButton" aria-label="" data-disabled="false" data-show-button-ids="" data-hide-button-ids="" data-on-submit-go-to="" data-param-submittingText="Submitting..." data-content="" data-style-guide-button="" rel="noopener"><span class="elButtonMain"><i class="fas fa-spinner fa-spin elButtonSpinner elButtonText"></i><span class="elButtonMainText elButtonText">${buttonText}</span></span><span class="elButtonSub"></span></a></div><span class="elCheckoutCouponCodeButtonLoading"><i style="margin:0px 10px;" class="fas fa-spinner fa-spin"></i></span></div></div>`; 1148 } 1149 html += `<paragraph-v1 class="elCouponCodeError"></paragraph-v1><div class="elCheckoutCouponApplied" hidden="true"><span class="elCheckoutCouponChip"><i class="fas fa-tag elCheckoutCouponChipIcon"></i><span class="elCheckoutCouponChipCode"></span><button type="button" class="elCheckoutCouponChipRemove" aria-label="${summaryTexts?.coupon?.remove ?? "Remove c
1149oupon"}"><i class="fas fa-times"></i></button></span></div></div>`; 1150 } 1151 html += `<div class="elOrderSummaryBody">`; 1152 const c14 = items; 1153 const fl15 = new CF2ForloopDrop(c14.length); 1154 for (const item of c14) { 1155 const forloop = fl15; 1156 html += `<div class="elOrderSummaryRow"><div class="elOrderSummaryRowLeft">${item?.productName}</div><div class="elOrderSummaryRowRight">`; 1157 if (item?.quantity && item?.quantity > 1) { 1158 html += `<span class="elOrderSummaryQuantity">${summaryTexts?.qty} ${item?.quantity}</span>`; 1159 } 1160 html += `<span>${item?.priceName}</span></div></div>`; 1161 forloop.next(); 1162 } 1163 if (state == "ok") { 1164 if (summary?.upcoming_invoice && summary?.upcoming_invoice?.line_items?.length) { 1165 html += `<hr class="elOrderSummaryDivider"/>`; 1166 const c16 = summary.upcoming_invoice.line_items; 1167 const fl17 = new CF2ForloopDrop(c16.length); 1168 for (const item of c16) { 1169 const forloop = fl17; 1170 html += `<div class="elOrderSummaryRow"><div class="elOrderSummaryRowLeft">${item?.variant_name}</div><div class="elOrderSummaryRowRight">`; 1171 if (item?.quantity && item?.quantity > 1) { 1172 html += `<span class="elOrderSummaryQuantity">${summaryTexts?.qty} ${item?.quantity}</span>`; 1173 } 1174 html += `<span>${item?.formatted}</span></div></div>`; 1175 forloop.next(); 1176 } 1177 } 1178 html += `<hr class="elOrderSummaryDivider"/>`; 1179 html += `<div class="elOrderSummaryRow"><div class="elOrderSummaryRowLeft">${summaryTexts?.taxes}</div><div class="elOrderSummaryRowRight">`; 1180 if (summary?.tax?.formatted && summary?.shipping?.amount >= 0) { 1181 html += `${summary?.tax?.formatted}`; 1182 } else { 1183 html += ` -- `; 1184 } 1185 html += `</div></div>`; 1186 if (summary?.discount?.amount > 0 && summary?.discounts?.length > 0) { 1187 const c18 = summary.discounts; 1188 const fl19 = new CF2ForloopDrop(c18.length); 1189 for (const discount of c18) { 1190 const forloop = fl19; 1191 html += `<div class="elOrderSummaryRow elOrderSummaryDiscountRow"><div class="elOrderSummaryRowLeft">${summaryTexts?.discount} `; 1192 if (discount?.code) { 1193 html += `(`; 1194 html += `${discount?.code})`; 1195 } 1196 html += `<span class="elOrderSummaryCouponClear">X</span></div><div class="elOrderSummaryRowRight">${summary?.discount?.formatted}</div></div>`; 1197 forloop.next(); 1198 } 1199 } 1200 if (hasPhysicalProducts2) { 1201 html += `<div class="elOrderSummaryRow"><div class="elOrderSummaryRowLeft">${summaryTexts?.shipping}</div><div class="elOrderSummaryRowRight">`; 1202 if (summary?.shipping?.amount > 0) { 1203 html += `${summary?.shipping?.formatted}`; 1204 } else if (summary?.shipping?.amount <= 0) { 1205 html += `${summaryTexts?.free}`; 1206 } else { 1207 html += ` -- `; 1208 } 1209 html += `</div></div>`; 1210 } 1211 html += `<hr class="elOrderSummaryDivider"/>`; 1212 html += `<div class="elOrderSummaryRow"><div class="elOrderSummaryRowLeft">${summaryTexts?.total}`; 1213 if (summary?.next_invoice_date) { 1214 html += ` - `; 1215 html += `<span class="elOrderSummaryNextInvoice"> ${summaryTexts?.dueOn} ${summary?.next_invoice_date}</span>`; 1216 } 1217 html += `</div><div class="elOrderSummaryRowRight"><span class="elOrderSummaryTotalPrice">`; 1218 if (summary?.interim) { 1219 html += `${summary?.interim?.formatted}`; 1220 } else { 1221 html += `${summary?.total?.formatted}`; 1222 } 1223 html += `</span></div></div>`; 1224 if (summary?.recurring && summary?.recurring?.showThen) { 1225 html += `<div class="elOrderSummaryRow elOrderSummaryRecurringRow"><div class="elOrderSummaryRowLeft">${summaryTexts?.then}</div><div class="elOrderSummaryRowRight">`; 1226 if (summary?.recurring?.discount?.amount > 0) { 1227 html += `<span class="elOrderSummaryRecurringStrikethrough">${summary?.recurring?.before_formatted}</span>`;
1228 } 1229 html += `${summary?.recurring?.total?.formatted}${summary?.recurring?.interval}</div></div>`; 1230 } 1231 } 1232 html += `</div>`; 1233 } 1234 } 1235 html += `</div>`; 1236 } 1237 } 1238 this.replaceContent(html); 1239 if (initializeChildrenInstances) { 1240 const scopeToYggRender = this.element.querySelectorAll("[ygg-render]").length > 0; 1241 const options = { scopeToYggRender }; 1242 CF2Component.hydrateTree(this.element, options); 1243 } 1244 } 1245}; 1246registerComponent("CheckoutOrderSummary/V1", CheckoutOrderSummaryV1); 1247window["CheckoutOrderSummaryV1"] = CheckoutOrderSummaryV1; 1248
1249// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-product-card-v2.ts 1250init_define_process(); 1251init_radio_v1(); 1252init_checkbox_v1(); 1253init_runtime(); 1254var CheckoutProductCardV2 = class extends CF2Component { 1255 constructor(el, runtimeSel) { 1256 super(el, runtimeSel); 1257 } 1258 mount() { 1259 this.can_purchase_again = !new URLSearchParams(window.location.search).get("manage_order_id"); 1260 this.variantValues = Object.entries(this.product.property_values_variant_mapping ?? {}).reduce((acc, entries) => { 1261 const values = entries[0].split(",").map((value) => parseInt(value)); 1262 acc[entries[1]] = values; 1263 return acc; 1264 }, {}) ?? {}; 1265 this.valuesPositions = this.product.sorted_property_values?.reduce((acc, property) => { 1266 property.value_ids.forEach((value, index) => { 1267 acc[value] = index; 1268 }); 1269 return acc; 1270 }, {}) ?? {}; 1271 } 1272 remove() { 1273 this.element.innerHTML = ""; 1274 } 1275 render(initializeChildrenInstances = false) { 1276 const is_server = true; 1277 const layout = this.layout ?? null; 1278 const featured = this.featured ?? null; 1279 const highlight_text = this.highlight_text ?? null; 1280 const selectType = this.selectType ?? null; 1281 const showImage = this.showImage ?? null; 1282 const showDescription = this.showDescription ?? null; 1283 const showCompareAtPrice = this.showCompareAtPrice ?? null; 1284 const isChecked = this.isChecked ?? null; 1285 const product = this.product ?? null; 1286 const variantDisplay = this.variantDisplay ?? null; 1287 const individualVariantId = this.individualVariantId ?? null; 1288 const variant = this.variant ?? null; 1289 const selected_price = this.selected_price ?? null; 1290 const quantity = this.quantity ?? null; 1291 const otherTexts = this.otherTexts ?? null; 1292 const can_purchase_again = this.can_purchase_again ?? true; 1293 const renderType = this.renderType ?? null; 1294 const selectedOrderIndex = this.selectedOrderIndex ?? null; 1295 const selectedUpdatableCartItemIndex = this.selectedUpdatableCartItemIndex ?? null; 1296 const updatableOrders = this.updatableOrders ?? null; 1297 const individualDirection = this.individualDirection ?? null; 1298 let html = ""; 1299 { 1300 const is_not_server = false; 1301 let priceDisplayType = "multiple"; 1302 let newOrder = selectedOrderIndex == -1; 1303 let showProductVariantSelection = true; 1304 let currentRenderType = renderType; 1305 const showUpgradeDowngrade = currentRenderType == "upgradeDowngrade"; 1306 const showReactivate = currentRenderType == "reactivate"; 1307 const showManageOrders = showUpgradeDowngrade || showReactivate; 1308 if (showManageOrders) { 1309 showProductVariantSelection = false; 1310 if (showUpgradeDowngrade) { 1311 priceDisplayType = "hide"; 1312 if (newOrder && variant?.prices?.length == 1) { 1313 priceDisplayType = "single"; 1314 } 1315 } 1316 if (showReactivate && variant?.prices?.length > 1) { 1317 priceDisplayType = "single"; 1318 } 1319 } 1320 const customVariants = product?.variants.filter((value) => value["default_variant"] == false); 1321 if (layout == "modern") { 1322 html += `<div class="elProductLayoutBackground"></div>`; 1323 html += `<div class="elProductModernItem"> `; 1324 if (selectType == "quantity") { 1325 html += `<div class="elProductInputWrapper elProductCardQuantityContainer"><div class="elProductInputControls"><button class="elProductCardInput">-</button><input class="elProductCardInput elProductCardShortInput" name="product" value="${quantity ?? 0}" min="0" type="number"/><button class="elProductCardInput">+</button></div></div>`; 1326 } else if (selectType == "quantity-forced") { 1327 html += `<div class="elProductInputWrapper elSelectWrapper elForcedQuantityWrapper"><select name="product" class="elProductCardInput elProductInputControls">`; 1328 const step = product?.step ?? 2; 1329 const min = product?.min ?? 0; 1330 const max = product?.max ?? 5; 1331 const item_count_step_1 = max - min; 1332 const item_count_step_2 = item_count_step_1 / step; 1333 const item_count_step_3 = item_count_step_2 | 0; 1334 const range = Array.apply(0, Array(item_count_step_3)).map((element, index) => index + 0); 1335 ; 1336 const c0 = range; 1337 const fl1 = new CF2ForloopDrop(c0.length); 1338 for (const i of c0) { 1339 const forloop = fl1; 1340 const value = i * step + min; 1341 html += `<option value="${value}">${value}</option>`; 1342 forloop.next(); 1343 } 1344 html += `</select><div class="elSelectArrow elForcedQuantitySelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 1345 } 1346 const isClassic = layout == "classic"; 1347 const isQuantityType = selectType == "quantity"; 1348 html += `<div class="elProductCardSelectInput`; 1349 if (isClassic == false || isQuantityType == true) { 1350 html += ` hide`; 1351 } 1352 html += `">`; 1353 if (selectType == "single") { 1354 if (isChecked) { 1355 html += `<div data-page-element="Radio/V1" class="elRadioWrapper id-Radio/V1" data-liquid-replace="item" data-checked="true" data-trigger-click-on-wrapper="false"><label class="elRadioLabel"><input type="radio" value="" name="product" checked class="elRadioInput"/><div class="elRadio"><div class="elRadioIcon"></div></div><span class="elRadioText"></span></label></div>`; 1356 } else { 1357 html += `<div data-page-element="Radio/V1" class="elRadioWrapper id-Radio/V1" data-liquid-replace="item" data-checked="" data-trigger-click-on-wrapper="false"><label class="elRadioLabel"><input type="radio" value="" name="product" class="elRadioInput"/><div class="elRadio"><div class="elRadioIcon"></div></div><span class="elRadioText"></span></label></div>`; 1358 } 1359 } else if (selectType == "multiple" || selectType == "quantity") { 1360 if (isChecked) { 1361 html += `<div data-page-element="Checkbox/V1" type="custom_type" class="elCheckboxWrapper elFormItemWrapper de-input-block id-Checkbox/V1" data-content="" data-liquid-replace="item" data-prevent-click-on-label="false" data-trigger-click-on-wrapper="false" data-checked="true"><label class="elCheckboxLabel"><input type="checkbox" value="${product?.id}
1361" name="product" checked data-prevent-garlic="false" class="elCheckboxInput inputHolder"/><div class="elCheckbox"><div class="elCheckboxIcon"><div class="elCheckboxIconSquare hide"></div><i class="elCheckboxIconCheck fas fa-check"></i></div></div><span class="elCheckboxText"></span></label><div data-input-status-type="true" data-error-container="true"></div></div>`; 1362 } else { 1363 html += `<div data-page-element="Checkbox/V1" type="custom_type" class="elCheckboxWrapper elFormItemWrapper de-input-block id-Checkbox/V1" data-content="" data-liquid-replace="item" data-prevent-click-on-label="false" data-trigger-click-on-wrapper="false" data-checked=""><label class="elCheckboxLabel"><input type="checkbox" value="${product?.id}" name="product" data-prevent-garlic="false" class="elCheckboxInput inputHolder"/><div class="elCheckbox"><div class="elCheckboxIcon"><div class="elCheckboxIconSquare hide"></div><i class="elCheckboxIconCheck fas fa-check"></i></div></div><span class="elCheckboxText"></span></label><div data-input-status-type="true" data-error-container="true"></div></div>`; 1364 } 1365 } 1366 html += `</div>`; 1367 if (showImage) { 1368 const imageUrl = variant?.image ?? product.image; 1369 if (imageUrl && imageUrl != "") { 1370 html += `<div class="elProductCardImage"><div data-page-element="Image/V2" class="elImageWrapper de-image-block id-Image/V2`; 1371 if (CF2Blank(imageUrl) && CF2Blank(null) && true) { 1372 html += ` forceHide`; 1373 } 1374 html += `" data-liquid-replace="item">`; 1375 if (imageUrl || !CF2Blank(null)) { 1376 html += `<img class="elImage" src="${imageUrl ?? null}" data-lazy-loading="true" data-lazy-loading="true"/>`; 1377 } else if (false) { 1378 html += `<div class="image-placeholder" title=""><span class="image-placeholder-header"></span></div>`; 1379 } 1380 html += `</div></div>`; 1381 } 1382 } 1383 html += `<div class="elProductCardNameContainer">`; 1384 if (featured && highlight_text) { 1385 html += `<div class="elProductCardHighlight">${highlight_text}</div>`; 1386 } 1387 if (variantDisplay == "individual") { 1388 html += `<span class="elProductCardInfoName">${variant?.name}</span>`; 1389 } else if (customVariants?.length > 1) { 1390 html += `<span class="elProductCardInfoName">${product?.default_variant?.name}</span>`; 1391 } else { 1392 html += `<span class="elProductCardInfoName">${variant?.name}</span>`; 1393 } 1394 if (showDescription) { 1395 html += `<span class="elProductCardInfoDescription">${(product?.description_override ?? variant.description ?? product.default_variant.description ?? "").replaceAll(` 1396`, "<br>")}</span>`; 1397 } 1398 html += `</div><div class="elProductCardPriceContainer">`; 1399 if (priceDisplayType == "multiple") { 1400 if (variant?.prices?.length == 1) { 1401 html += `<div class="elProductCardInfoPrice">`; 1402 if (showCompareAtPrice) { 1403 const compare_at_amount = selected_price?.compare_at_amount; 1404 if (compare_at_amount) { 1405 html += `<span class="elProductCardAnchorPrice">${compare_at_amount}</span>`; 1406 } 1407 } 1408 html += `<span class="elProductCardFinalPrice">
1408${selected_price?.name}</span></div>`; 1409 } else { 1410 html += `<div class="elSelectWrapper"><select name="variant_price">`; 1411 const c2 = variant.prices; 1412 const fl3 = new CF2ForloopDrop(c2.length); 1413 for (const price of c2) { 1414 const forloop = fl3; 1415 html += `<option `; 1416 if (selected_price?.id == price?.id) { 1417 html += `selected`; 1418 } 1419 html += ` value="${price?.id}">${price?.name}</option>`; 1420 forloop.next(); 1421 } 1422 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 1423 } 1424 } else if (priceDisplayType == "single") { 1425 html += `<div class="elProductCardInfoPrice">`; 1426 if (showCompareAtPrice) { 1427 const compare_at_amount = selected_price?.compare_at_amount; 1428 if (compare_at_amount) { 1429 html += `<span class="elProductCardAnchorPrice">${compare_at_amount}</span>`; 1430 } 1431 } 1432 html += `<span class="elProductCardFinalPrice">
1432${selected_price?.name}</span></div>`; 1433 } 1434 html += `</div>`; 1435 if (showProductVariantSelection && variantDisplay != "individual") { 1436 if (customVariants?.length > 1) { 1437 html += `<div class="elProductSelectSelectorsWrapper">`; 1438 const c4 = product.sorted_property_values; 1439 const fl5 = new CF2ForloopDrop(c4.length); 1440 for (const property_values of c4) { 1441 const forloop = fl5; 1442 const property_id = property_values?.property_id; 1443 const select_index = forloop?.index0; 1444 html += ` `; 1445 html += `<div class="elSelectWrapper"><select class="elVariantSelector" name="property_${property_id}">`; 1446 const c6 = property_values.value_ids; 1447 const fl7 = new CF2ForloopDrop(c6.length); 1448 for (const value_id of c6) { 1449 const forloop2 = fl7; 1450 html += `<option `; 1451 if (variant?.property_value_ids?.[select_index] == value_id) { 1452 html += `selected`; 1453 } 1454 html += ` value="${value_id}">${product?.all_properties_values?.[value_id]}</option>`; 1455 forloop2.next(); 1456 } 1457 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 1458 forloop.next(); 1459 } 1460 html += `</div>`; 1461 } 1462 } 1463 if (showManageOrders) { 1464 const amount_of_orders = updatableOrders?.length; 1465 if (amount_of_orders && amount_of_orders > 0) { 1466 if (variantDisplay == "individual") { 1467 const isCurrentPlan = individualDirection == "current"; 1468 if (isCurrentPlan) { 1469 html += `<div class="elProductCardSubscriptionsBanner"><i class="fas fa-sync-alt"></i><span>Current plan</span>`; 1470 if (can_purchase_again) { 1471 html += `<span class="elProductCardCurrentPlanSeparator">-</span>`; 1472 html += `<div class="elProductCardNewOrder elProductCardPurchaseAgainInline"><span>Purchase Again</span></div>`; 1473 } 1474 html += `</div>`; 1475 } else { 1476 html += `<div class="elProductCardSubscriptionsBanner"><i class="fas fa-sync-alt"></i><span>${individualDirection}</span></div>`; 1477 html += `<div class="elProductCardManageOrders`; 1478 if (CF2Blank(isChecked)) { 1479 html += ` elHide`; 1480 } 1481 html += `"><div class="elProductCardOrdersWrapper"><div class="elProductCardTitle"><span>${individualDirection} </span><div></div></div><div class="elProductCardOrders">`; 1482 const c8 = updatableOrders; 1483 const fl9 = new CF2ForloopDrop(c8.length); 1484 for (const order of c8) { 1485 const forloop = fl9; 1486 const orderIndex = forloop?.index0; 1487 html += `<div class="elProductCardOrder`; 1488 if (selectedOrderIndex == orderIndex) { 1489 html += ` elProductCardOrderSelected`; 1490 } 1491 html += `" data-order-index="${orderIndex}"><div class="elProductCardOrderDetails"><div class="elProductCardOrderDetailsNumber"><i class="fas fa-receipt"></i><span>${otherTexts?.upgradesDowngradesReactivations?.order} ${order?.number}</span></div><span class="elProductCardOrderDetailsManage">${individualDirection}</span></div>`; 1492 if (selectedOrderIndex == orderIndex) { 1493 html += `<div class="elProductCardOrderActions"><a data-page-element="LinkNode" class="elTypographyLink elProductCardShowOrderDetailsLink id-LinkNode" href="#show-selected-order-details" target="_self" data-show-button-ids="" data-hide-button-ids="" data-selected="${false}" data-liquid-replace="item"><span>${otherTexts?.upgradesDowngradesReactivations?.viewOrderDetails}</span></a><span class="elProductCardDirectionBadge">${individualDirection} ${variant?.name}
1493 - ${selected_price?.name}</span></div>`; 1494 } 1495 html += `</div>`; 1496 forloop.next(); 1497 } 1498 html += `</div></div>`; 1499 if (can_purchase_again) { 1500 html += `<div class="elProductCardNewOrderWrapper"><div class="elProductCardTitle"><span>${otherTexts?.upgradesDowngradesReactivations?.purchaseAgain}</span><div></div></div><div class="elProductCardNewOrder`; 1501 if (newOrder == true) { 1502 html += ` elProductCardOrderSelected`; 1503 } 1504 html += `"><div class="elProductCardNewOrderTitle"><i class="fas fa-plus-circle"></i><span>${otherTexts?.upgradesDowngradesReactivations?.newOrder}</span></div>`; 1505 if (newOrder == true) { 1506 html += `<div class="elProductCardOrderActions">`; 1507 if (variantDisplay != "individual") { 1508 if (customVariants?.length > 1) { 1509 html += `<div class="elProductSelectSelectorsWrapper">`; 1510 const c10 = product.sorted_property_values; 1511 const fl11 = new CF2ForloopDrop(c10.length); 1512 for (const property_values of c10) { 1513 const forloop = fl11; 1514 const property_id = property_values?.property_id; 1515 const select_index = forloop?.index0; 1516 html += ` `; 1517 html += `<div class="elSelectWrapper"><select class="elVariantSelector" name="property_${property_id}">`; 1518 const c12 = property_values.value_ids; 1519 const fl13 = new CF2ForloopDrop(c12.length); 1520 for (const value_id of c12) { 1521 const forloop2 = fl13; 1522 html += `<option `; 1523 if (variant?.property_value_ids?.[select_index] == value_id) { 1524 html += `selected`; 1525 } 1526 html += ` value="${value_id}">${product?.all_properties_values?.[value_id]}</option>`; 1527 forloop2.next(); 1528 } 1529 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 1530 forloop.next(); 1531 } 1532 html += `</div>`; 1533 } 1534 } 1535 if (priceDisplayType == "single" && variant?.prices?.length > 1) { 1536 html += `<div class="elProductSelectSelectorsWrapper"><div class="elSelectWrapper"><select name="variant_price">`; 1537 const c14 = variant.prices; 1538 const fl15 = new CF2ForloopDrop(c14.length); 1539 for (const price of c14) { 1540 const forloop = fl15; 1541 html += `<option `; 1542 if (selected_price?.id == price?.id) { 1543 html += `selected`; 1544 } 1545 html += ` value="${price?.id}">${price?.name}</option>`; 1546 forloop.next(); 1547 } 1548 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div></div>`; 1549 } 1550 html += `</div>`; 1551 } 1552 html += `</div></div>`; 1553 } 1554 html += `</div>`; 1555 } 1556 } else { 1557 let active_order = false; 1558 let canceled_order = false; 1559 const amount_of_orders2 = updatableOrders?.length; 1560 const c16 = updatableOrders; 1561 const fl17 = new CF2ForloopDrop(c16.length); 1562 for (const order of c16) { 1563 const forloop = fl17; 1564 if (order?.type == "reactivate") { 1565 canceled_order = true; 1566 } else { 1567 active_order = true; 1568 } 1569 forloop.next(); 1570 } 1571 html += `<div class="elProductCardSubscriptionsBanner"><i class="fas fa-sync-alt"></i>`; 1572 if (active_order && canceled_order) { 1573 if (amount_of_orders2 > 1) { 1574 html += `<span>${amount_of_orders2} ${otherTexts?.upgradesDowngradesReactivations?.multipleExistingSubscriptions}</span>`;
1575 } else { 1576 html += `<span>${amount_of_orders2} ${otherTexts?.upgradesDowngradesReactivations?.singleExistingSubscription}</span>`; 1577 } 1578 } else if (canceled_order) { 1579 if (amount_of_orders2 > 1) { 1580 html += `<span>${amount_of_orders2} </span>`; 1581 } else { 1582 html += `<span>${amount_of_orders2} </span>`; 1583 } 1584 } else { 1585 if (amount_of_orders2 > 1) { 1586 html += `<span>${amount_of_orders2} ${otherTexts?.upgradesDowngradesReactivations?.multipleActiveSubscriptions}</span>`; 1587 } else { 1588 html += `<span>${amount_of_orders2} ${otherTexts?.upgradesDowngradesReactivations?.singleActiveSubscription}</span>`; 1589 } 1590 } 1591 html += `</div>`; 1592 html += `<div class="elProductCardManageOrders`; 1593 if (CF2Blank(isChecked)) { 1594 html += ` elHide`; 1595 } 1596 html += `"><div class="elProductCardOrdersWrapper"><div class="elProductCardTitle"><span>${otherTexts?.upgradesDowngradesReactivations?.manageSubscriptions}</span><div></div></div><div class="elProductCardOrders">`; 1597 const c18 = updatableOrders; 1598 const fl19 = new CF2ForloopDrop(c18.length); 1599 for (const order of c18) { 1600 const forloop = fl19; 1601 const orderIndex = forloop?.index0; 1602 html += `<div class="elProductCardOrder`; 1603 if (selectedOrderIndex == orderIndex) { 1604 html += ` elProductCardOrderSelected`; 1605 } 1606 html += `" data-order-index="${orderIndex}"><div class="elProductCardOrderDetails"><div class="elProductCardOrderDetailsNumber"><i class="fas fa-receipt"></i><span>${otherTexts?.upgradesDowngradesReactivations?.order} ${order?.number}</span></div>`; 1607 if (order?.type == "reactivate") { 1608 html += `<span class="elProductCardOrderDetailsReactivate"></span>`; 1609 } else { 1610 html += `<span class="elProductCardOrderDetailsManage">${otherTexts?.upgradesDowngradesReactivations?.manage}</span>`; 1611 } 1612 html += `</div>`; 1613 if (selectedOrderIndex == orderIndex) { 1614 html += `<div class="elProductCardOrderActions"><a data-page-element="LinkNode" class="elTypographyLink elProductCardShowOrderDetailsLink id-LinkNode" href="#show-selected-order-details" target="_self" data-show-button-ids="" data-hide-button-ids="" data-selected="${false}" data-liquid-replace="item"><span>${otherTexts?.upgradesDowngradesReactivations?.viewOrderDetails}</span></a>`; 1615 if (order?.type == "upgradeDowngrade") { 1616 const updatableItem = order?.updatableItems?.[selectedUpdatableCartItemIndex]; 1617 html += `<div class="elCustomSelect"><div class="elCustomSelectPreview"><span class="elCustomSelectPreviewText"><span class="elCustomSelectPreviewDirection" data-direction="${updatableItem?.direction}">${updatableItem?.direction} </span><span class="elCustomSelectPreviewInfo">${updatableItem?.variantName} - ${updatableItem?.priceName}</span></span><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div><select name="upgradeDowngrade">`; 1618 const c20 = order.updatableItems; 1619 const fl21 = new CF2ForloopDrop(c20.length); 1620 for (const updatableItem2 of c20) { 1621 const forloop2 = fl21; 1622 const index = forloop2?.index0; 1623 html += `<option `; 1624 if (index == selectedUpdatableCartItemIndex) { 1625 html += `selected`; 1626 } 1627 html += ` value="${index}">${updatableItem2?.direction} ${updatableItem2?.variantName} - ${updatableItem2?.priceName}</option>`; 1628 forloop2.next(); 1629 } 1630 html += `</select></div>`; 1631 } else { 1632 if (customVariants?.length > 1) { 1633 html += `<div class="elCustomSelect"><div class="elCustomSelectPreview"><span class="elCustomSelectPreviewText"><span class="elCustomSelectPreviewDirection" data-direction="Reactivate"></span><span class="elCustomSelectPreviewInfo">${variant?.name}</span></span><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div><select class="elVariantSelector">`; 1634 const c22 = product.variants; 1635 const fl23 = new CF2ForloopDrop(c22.length); 1636 for (const product_variant of c22) { 1637 const forloop2 = fl23; 1638 let combined_variant_name = ""; 1639 const c24 = product.sorted_property_values; 1640 const fl25 = new CF2ForloopDrop(c24.length); 1641 for (const property_values of c24) { 1642 const forloop3 = fl25; 1643 const index0 = forloop3?.index0; 1644 const property_id = property_values?.property_id; 1645 const property_value_id = product_variant?.property_value_ids?.[index0]; 1646 if (combined_variant_name != "") { 1647 combined_variant_name = combined_variant_name.toString().concat(", "); 1648 } 1649 combined_variant_name = combined_variant_name.toString().concat(product.all_properties[property_id]); 1650 combined_variant_name = combined_variant_name.toString().concat(": "); 1651 combined_variant_name = combined_variant_name.toString().concat(product.all_properties_values[property_value_id]); 1652 forloop3.next(); 1653 } 1654 html += `<option value="${product_variant?.property_value_ids}" `; 1655 if (product_variant?.id == variant?.id) { 1656 html += `selected`; 1657 } 1658 html += `>${combined_variant_name}</option>`; 1659 forloop2.next(); 1660 } 1661 html += `</select></div>`; 1662 } 1663 if (priceDisplayType == "single" && variant?.prices?.length > 1) { 1664 html += `<div class="elProductSelectSelectorsWrapper"><div class="elSelectWrapper"><select name="variant_price">`; 1665 const c26 = variant.prices; 1666 const fl27 = new CF2ForloopDrop(c26.length); 1667 for (const price of c26) { 1668 const forloop2 = fl27; 1669 html += `<option `; 1670 if (selected_price?.id == price?.id) { 1671 html += `selected`; 1672 } 1673 html += ` value="${price?.id}">${price?.name}</option>`; 1674 forloop2.next(); 1675 } 1676 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div></div>`; 1677 } 1678 } 1679 html += `</div>`; 1680 } 1681 html += `</div>`; 1682 forloop.next(); 1683 } 1684 html += `</div></div>`; 1685 if (can_purchase_again) { 1686 html += `<div class="elProductCardNewOrderWrapper"><div class="elProductCardTitle"><span>${otherTexts?.upgradesDowngradesReactivations?.purchaseAgain}</span><div></div></div><div class="elProductCardNewOrder`; 1687 if (newOrder == true) { 1688 html += ` elProductCardOrderSelected`; 1689 } 1690 html += `"><div class="elProductCardNewOrderTitle"><i class="fas fa-plus-circle"></i><span>${otherTexts?.upgradesDowngradesReactivations?.newOrder}</span></div>`; 1691 if (newOrder == true) { 1692 html += `<div class="elProductCardOrderActions">`; 1693 if (variantDisplay != "individual") { 1694 if (customVariants?.length > 1) { 1695 html += `<div class="elProductSelectSelectorsWrapper">`; 1696 const c28 = product.sorted_property_values; 1697 const fl29 = new CF2ForloopDrop(c28.length); 1698 for (const property_values of c28) { 1699 const forloop = fl29; 1700 const property_id = property_values?.property_id; 1701 const select_index = forloop?.index0; 1702 html += ` `; 1703 html += `<div class="elSelectWrapper"><select class="elVariantSelector" name="property_${property_id}">`; 1704 const c30 = property_values.value_ids; 1705 const fl31 = new CF2ForloopDrop(c30.length); 1706 for (const value_id of c30) { 1707 const forloop2 = fl31; 1708 html += `<option `; 1709 if (variant?.property_value_ids?.[select_index] == value_id) { 1710 html += `selected`; 1711 } 1712 html += ` value="${value_id}">${product?.all_properties_values?.[value_id]}</option>`; 1713 forloop2.next(); 1714 } 1715 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 1716 forloop.next(); 1717 } 1718 html += `</div>`; 1719 } 1720 } 1721 if (priceDisplayType == "single" && variant?.prices?.length > 1) { 1722 html += `<div class="elProductSelectSelectorsWrapper"><div class="elSelectWrapper"><select name="variant_price">`; 1723 const c32 = variant.prices; 1724 const fl33 = new CF2ForloopDrop(c32.length); 1725 for (const price of c32) { 1726 const forloop = fl33; 1727 html += `<option `; 1728 if (selected_price?.id == price?.id) { 1729 html += `selected`; 1730 } 1731 html += ` value="${price?.id}">${price?.name}</option>`; 1732 forloop.next(); 1733 } 1734 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div></div>`; 1735 } 1736 html += `</div>`; 1737 } 1738 html += `</div></div>`; 1739 } 1740 html += `</div>`; 1741 } 1742 } 1743 } 1744 html += `</div>`; 1745 } else if (layout == "grid") {
1746 html += `<div class="elProductLayoutBackground"></div>`; 1747 html += `<div class="elProductGridItem">`; 1748 if (selectType == "quantity") { 1749 html += `<div class="elProductInputWrapper elProductCardQuantityContainer"><div class="elProductInputControls"><button class="elProductCardInput">-</button><input class="elProductCardInput elProductCardShortInput" name="product" value="${quantity ?? 0}" min="0" type="number"/><button class="elProductCardInput">+</button></div></div>`; 1750 } else if (selectType == "quantity-forced") { 1751 html += `<div class="elProductInputWrapper elSelectWrapper elForcedQuantityWrapper"><select name="product" class="elProductCardInput elProductInputControls">`; 1752 const step = product?.step ?? 2; 1753 const min = product?.min ?? 0; 1754 const max = product?.max ?? 5; 1755 const item_count_step_1 = max - min; 1756 const item_count_step_2 = item_count_step_1 / step; 1757 const item_count_step_3 = item_count_step_2 | 0; 1758 const range = Array.apply(0, Array(item_count_step_3)).map((element, index) => index + 0); 1759 ; 1760 const c34 = range; 1761 const fl35 = new CF2ForloopDrop(c34.length); 1762 for (const i of c34) { 1763 const forloop = fl35; 1764 const value = i * step + min; 1765 html += `<option value="${value}">${value}</option>`; 1766 forloop.next(); 1767 } 1768 html += `</select><div class="elSelectArrow elForcedQuantitySelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 1769 } 1770 const isClassic = layout == "classic"; 1771 const isQuantityType = selectType == "quantity"; 1772 html += `<div class="elProductCardSelectInput`; 1773 if (isClassic == false || isQuantityType == true) { 1774 html += ` hide`; 1775 } 1776 html += `">`; 1777 if (selectType == "single") { 1778 if (isChecked) { 1779 html += `<div data-page-element="Radio/V1" class="elRadioWrapper id-Radio/V1" data-liquid-replace="item" data-checked="true" data-trigger-click-on-wrapper="false"><label class="elRadioLabel"><input type="radio" value="" name="product" checked class="elRadioInput"/><div class="elRadio"><div class="elRadioIcon"></div></div><span class="elRadioText"></span></label></div>`; 1780 } else { 1781 html += `<div data-page-element="Radio/V1" class="elRadioWrapper id-Radio/V1" data-liquid-replace="item" data-checked="" data-trigger-click-on-wrapper="false"><label class="elRadioLabel"><input type="radio" value="" name="product" class="elRadioInput"/><div class="elRadio"><div class="elRadioIcon"></div></div><span class="elRadioText"></span></label></div>`; 1782 } 1783 } else if (selectType == "multiple" || selectType == "quantity") { 1784 if (isChecked) { 1785 html += `<div data-page-element="Checkbox/V1" type="custom_type" class="elCheckboxWrapper elFormItemWrapper de-input-block id-Checkbox/V1" data-content="" data-liquid-replace="item" data-prevent-click-on-label="false" data-trigger-click-on-wrapper="false" data-checked="true"><label class="elCheckboxLabel"><input type="checkbox" value="${product?.id}" name="product" checked data-prevent-garlic="false" class="elCheckboxInput inputHolder"/><div class="elCheckbox"><div class="elCheckboxIcon"><div class="elCheckboxIconSquare hide"></div><i class="elCheckboxIconCheck fas fa-check"></i></div></div><span class="elCheckboxText"></span></label><div data-input-status-type="true" data-error-container="true"></div></div>`; 1786 } else { 1787 html += `<div data-page-element="Checkbox/V1" type="custom_type" class="elCheckboxWrapper elFormItemWrapper de-input-block id-Checkbox/V1" data-content="" data-liquid-replace="item" data-prevent-click-on-label="false" data-trigger-click-on-wrapper="false" data-checked=""><label class="elCheckboxLabel"><input type="checkbox" value="${product?.id}" name="product" data-prevent-garlic="false" class="elCheckboxInput inputHolder"/><div class="elCheckbox"><div class="elCheckboxIcon"><div class="elCheckboxIconSquare hide"></div><i class="elCheckboxIconCheck fas fa-check"></i></div></div><span class="elCheckboxText"></span></label><div data-input-status-type="true" data-error-container="true"></div></div>`; 1788 } 1789 } 1790 html += `</div>`; 1791 if (showImage) { 1792 const imageUrl = variant?.image ?? product.image; 1793 if (imageUrl && imageUrl != "") { 1794 html += `<div class="elProductCardImage"><div data-page-element="Image/V2" class="elImageWrapper de-image-block id-Image/V2`; 1795 if (CF2Blank(imageUrl) && CF2Blank(null) && true) { 1796 html += ` forceHide`; 1797 } 1798 html += `" data-liquid-replace="item">`; 1799 if (imageUrl || !CF2Blank(null)) { 1800 html += `<img class="elImage" src="${imageUrl ?? null}" data-lazy-loading="true" data-lazy-loading="true"/>`; 1801 } else if (false) { 1802 html += `<div class="image-placeholder" title=""><span class="image-placeholder-header"></span></div>`; 1803 } 1804 html += `</div></div>`; 1805 } 1806 } 1807 html += `<div class="elProductCardNamePriceWrapper"><div class="elProductCardNameContainer">`; 1808 if (featured && highlight_text) { 1809 html += `<div class="elProductCardHighlight">${highlight_text}</div>`; 1810 } 1811 if (variantDisplay == "individual") { 1812 html += `<span class="elProductCardInfoName">${variant?.name}</span>`;
1813 } else if (customVariants?.length > 1) { 1814 html += `<span class="elProductCardInfoName">${product?.default_variant?.name}</span>`; 1815 } else { 1816 html += `<span class="elProductCardInfoName">${variant?.name}</span>`; 1817 } 1818 if (showDescription) { 1819 html += `<span class="elProductCardInfoDescription">${(product?.description_override ?? variant.description ?? product.default_variant.description ?? "").replaceAll(` 1820`, "<br>")}</span>`; 1821 } 1822 html += `</div><div class="elProductCardPriceContainer">`; 1823 if (priceDisplayType == "multiple") { 1824 if (variant?.prices?.length == 1) { 1825 html += `<div class="elProductCardInfoPrice">`; 1826 if (showCompareAtPrice) { 1827 const compare_at_amount = selected_price?.compare_at_amount; 1828 if (compare_at_amount) { 1829 html += `<span class="elProductCardAnchorPrice">${compare_at_amount}</span>`; 1830 } 1831 } 1832 html += `<span class="elProductCardFinalPrice">
1832${selected_price?.name}</span></div>`; 1833 } else { 1834 html += `<div class="elSelectWrapper"><select name="variant_price">`; 1835 const c36 = variant.prices; 1836 const fl37 = new CF2ForloopDrop(c36.length); 1837 for (const price of c36) { 1838 const forloop = fl37; 1839 html += `<option `; 1840 if (selected_price?.id == price?.id) { 1841 html += `selected`; 1842 } 1843 html += ` value="${price?.id}">${price?.name}</option>`; 1844 forloop.next(); 1845 } 1846 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 1847 } 1848 } else if (priceDisplayType == "single") { 1849 html += `<div class="elProductCardInfoPrice">`; 1850 if (showCompareAtPrice) { 1851 const compare_at_amount = selected_price?.compare_at_amount; 1852 if (compare_at_amount) { 1853 html += `<span class="elProductCardAnchorPrice">${compare_at_amount}</span>`;
1854 } 1855 } 1856 html += `<span class="elProductCardFinalPrice">${selected_price?.name}</span></div>`; 1857 } 1858 html += `</div></div></div>`; 1859 if (showProductVariantSelection && variantDisplay != "individual") { 1860 if (customVariants?.length > 1) { 1861 html += `<div class="elProductSelectSelectorsWrapper">`; 1862 const c38 = product.sorted_property_values; 1863 const fl39 = new CF2ForloopDrop(c38.length); 1864 for (const property_values of c38) { 1865 const forloop = fl39; 1866 const property_id = property_values?.property_id; 1867 const select_index = forloop?.index0; 1868 html += ` `; 1869 html += `<div class="elSelectWrapper"><select class="elVariantSelector" name="property_${property_id}">`; 1870 const c40 = property_values.value_ids; 1871 const fl41 = new CF2ForloopDrop(c40.length); 1872 for (const value_id of c40) { 1873 const forloop2 = fl41; 1874 html += `<option `; 1875 if (variant?.property_value_ids?.[select_index] == value_id) { 1876 html += `selected`; 1877 } 1878 html += ` value="${value_id}">${product?.all_properties_values?.[value_id]}</option>`; 1879 forloop2.next(); 1880 } 1881 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 1882 forloop.next(); 1883 } 1884 html += `</div>`; 1885 } 1886 } 1887 if (showManageOrders) { 1888 const amount_of_orders = updatableOrders?.length; 1889 if (amount_of_orders && amount_of_orders > 0) { 1890 if (variantDisplay == "individual") { 1891 const isCurrentPlan = individualDirection == "current"; 1892 if (isCurrentPlan) { 1893 html += `<div class="elProductCardSubscriptionsBanner"><i class="fas fa-sync-alt"></i><span>Current plan</span>`; 1894 if (can_purchase_again) { 1895 html += `<span class="elProductCardCurrentPlanSeparator">-</span>`; 1896 html += `<div class="elProductCardNewOrder elProductCardPurchaseAgainInline"><span>Purchase Again</span></div>`; 1897 } 1898 html += `</div>`; 1899 } else { 1900 html += `<div class="elProductCardSubscriptionsBanner"><i class="fas fa-sync-alt"></i><span>${individualDirection}</span></div>`; 1901 html += `<div class="elProductCardManageOrders`; 1902 if (CF2Blank(isChecked)) { 1903 html += ` elHide`; 1904 } 1905 html += `"><div class="elProductCardOrdersWrapper"><div class="elProductCardTitle"><span>${individualDirection} </span><div></div></div><div class="elProductCardOrders">`; 1906 const c42 = updatableOrders; 1907 const fl43 = new CF2ForloopDrop(c42.length); 1908 for (const order of c42) { 1909 const forloop = fl43; 1910 const orderIndex = forloop?.index0; 1911 html += `<div class="elProductCardOrder`; 1912 if (selectedOrderIndex == orderIndex) { 1913 html += ` elProductCardOrderSelected`; 1914 } 1915 html += `" data-order-index="${orderIndex}"><div class="elProductCardOrderDetails"><div class="elProductCardOrderDetailsNumber"><i class="fas fa-receipt"></i><span>${otherTexts?.upgradesDowngradesReactivations?.order} ${order?.number}</span></div><span class="elProductCardOrderDetailsManage">${individualDirection}</span></div>`; 1916 if (selectedOrderIndex == orderIndex) { 1917 html += `<div class="elProductCardOrderActions"><a data-page-element="LinkNode" class="elTypographyLink elProductCardShowOrderDetailsLink id-LinkNode" href="#show-selected-order-details" target="_self" data-show-button-ids="" data-hide-button-ids="" data-selected="${false}" data-liquid-replace="item"><span>${otherTexts?.upgradesDowngradesReactivations?.viewOrderDetails}</span></a><span class="elProductCardDirectionBadge">${individualDirection} ${variant?.name}
1917 - ${selected_price?.name}</span></div>`; 1918 } 1919 html += `</div>`; 1920 forloop.next(); 1921 } 1922 html += `</div></div>`; 1923 if (can_purchase_again) { 1924 html += `<div class="elProductCardNewOrderWrapper"><div class="elProductCardTitle"><span>${otherTexts?.upgradesDowngradesReactivations?.purchaseAgain}</span><div></div></div><div class="elProductCardNewOrder`; 1925 if (newOrder == true) { 1926 html += ` elProductCardOrderSelected`; 1927 } 1928 html += `"><div class="elProductCardNewOrderTitle"><i class="fas fa-plus-circle"></i><span>${otherTexts?.upgradesDowngradesReactivations?.newOrder}</span></div>`; 1929 if (newOrder == true) { 1930 html += `<div class="elProductCardOrderActions">`; 1931 if (variantDisplay != "individual") { 1932 if (customVariants?.length > 1) { 1933 html += `<div class="elProductSelectSelectorsWrapper">`; 1934 const c44 = product.sorted_property_values; 1935 const fl45 = new CF2ForloopDrop(c44.length); 1936 for (const property_values of c44) { 1937 const forloop = fl45; 1938 const property_id = property_values?.property_id; 1939 const select_index = forloop?.index0; 1940 html += ` `; 1941 html += `<div class="elSelectWrapper"><select class="elVariantSelector" name="property_${property_id}">`; 1942 const c46 = property_values.value_ids; 1943 const fl47 = new CF2ForloopDrop(c46.length); 1944 for (const value_id of c46) { 1945 const forloop2 = fl47; 1946 html += `<option `; 1947 if (variant?.property_value_ids?.[select_index] == value_id) { 1948 html += `selected`; 1949 } 1950 html += ` value="${value_id}">${product?.all_properties_values?.[value_id]}</option>`; 1951 forloop2.next(); 1952 } 1953 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 1954 forloop.next(); 1955 } 1956 html += `</div>`; 1957 } 1958 } 1959 if (priceDisplayType == "single" && variant?.prices?.length > 1) { 1960 html += `<div class="elProductSelectSelectorsWrapper"><div class="elSelectWrapper"><select name="variant_price">`; 1961 const c48 = variant.prices; 1962 const fl49 = new CF2ForloopDrop(c48.length); 1963 for (const price of c48) { 1964 const forloop = fl49; 1965 html += `<option `; 1966 if (selected_price?.id == price?.id) { 1967 html += `selected`; 1968 } 1969 html += ` value="${price?.id}">${price?.name}</option>`; 1970 forloop.next(); 1971 } 1972 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div></div>`; 1973 } 1974 html += `</div>`; 1975 } 1976 html += `</div></div>`; 1977 } 1978 html += `</div>`; 1979 } 1980 } else { 1981 let active_order = false; 1982 let canceled_order = false; 1983 const amount_of_orders2 = updatableOrders?.length; 1984 const c50 = updatableOrders; 1985 const fl51 = new CF2ForloopDrop(c50.length); 1986 for (const order of c50) { 1987 const forloop = fl51; 1988 if (order?.type == "reactivate") { 1989 canceled_order = true; 1990 } else { 1991 active_order = true; 1992 } 1993 forloop.next(); 1994 } 1995 html += `<div class="elProductCardSubscriptionsBanner"><i class="fas fa-sync-alt"></i>`; 1996 if (active_order && canceled_order) { 1997 if (amount_of_orders2 > 1) { 1998 html += `<span>${amount_of_orders2} ${otherTexts?.upgradesDowngradesReactivations?.multipleExistingSubscriptions}</span>`;
1999 } else { 2000 html += `<span>${amount_of_orders2} ${otherTexts?.upgradesDowngradesReactivations?.singleExistingSubscription}</span>`; 2001 } 2002 } else if (canceled_order) { 2003 if (amount_of_orders2 > 1) { 2004 html += `<span>${amount_of_orders2} </span>`; 2005 } else { 2006 html += `<span>${amount_of_orders2} </span>`; 2007 } 2008 } else { 2009 if (amount_of_orders2 > 1) { 2010 html += `<span>${amount_of_orders2} ${otherTexts?.upgradesDowngradesReactivations?.multipleActiveSubscriptions}</span>`; 2011 } else { 2012 html += `<span>${amount_of_orders2} ${otherTexts?.upgradesDowngradesReactivations?.singleActiveSubscription}</span>`; 2013 } 2014 } 2015 html += `</div>`; 2016 html += `<div class="elProductCardManageOrders`; 2017 if (CF2Blank(isChecked)) { 2018 html += ` elHide`; 2019 } 2020 html += `"><div class="elProductCardOrdersWrapper"><div class="elProductCardTitle"><span>${otherTexts?.upgradesDowngradesReactivations?.manageSubscriptions}</span><div></div></div><div class="elProductCardOrders">`; 2021 const c52 = updatableOrders; 2022 const fl53 = new CF2ForloopDrop(c52.length); 2023 for (const order of c52) { 2024 const forloop = fl53; 2025 const orderIndex = forloop?.index0; 2026 html += `<div class="elProductCardOrder`; 2027 if (selectedOrderIndex == orderIndex) { 2028 html += ` elProductCardOrderSelected`; 2029 } 2030 html += `" data-order-index="${orderIndex}"><div class="elProductCardOrderDetails"><div class="elProductCardOrderDetailsNumber"><i class="fas fa-receipt"></i><span>${otherTexts?.upgradesDowngradesReactivations?.order} ${order?.number}</span></div>`; 2031 if (order?.type == "reactivate") { 2032 html += `<span class="elProductCardOrderDetailsReactivate"></span>`; 2033 } else { 2034 html += `<span class="elProductCardOrderDetailsManage">${otherTexts?.upgradesDowngradesReactivations?.manage}</span>`; 2035 } 2036 html += `</div>`; 2037 if (selectedOrderIndex == orderIndex) { 2038 html += `<div class="elProductCardOrderActions"><a data-page-element="LinkNode" class="elTypographyLink elProductCardShowOrderDetailsLink id-LinkNode" href="#show-selected-order-details" target="_self" data-show-button-ids="" data-hide-button-ids="" data-selected="${false}" data-liquid-replace="item"><span>${otherTexts?.upgradesDowngradesReactivations?.viewOrderDetails}</span></a>`; 2039 if (order?.type == "upgradeDowngrade") { 2040 const updatableItem = order?.updatableItems?.[selectedUpdatableCartItemIndex]; 2041 html += `<div class="elCustomSelect"><div class="elCustomSelectPreview"><span class="elCustomSelectPreviewText"><span class="elCustomSelectPreviewDirection" data-direction="${updatableItem?.direction}">${updatableItem?.direction} </span><span class="elCustomSelectPreviewInfo">${updatableItem?.variantName} - ${updatableItem?.priceName}</span></span><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div><select name="upgradeDowngrade">`; 2042 const c54 = order.updatableItems; 2043 const fl55 = new CF2ForloopDrop(c54.length); 2044 for (const updatableItem2 of c54) { 2045 const forloop2 = fl55; 2046 const index = forloop2?.index0; 2047 html += `<option `; 2048 if (index == selectedUpdatableCartItemIndex) { 2049 html += `selected`; 2050 } 2051 html += ` value="${index}">${updatableItem2?.direction} ${updatableItem2?.variantName} - ${updatableItem2?.priceName}</option>`; 2052 forloop2.next(); 2053 } 2054 html += `</select></div>`; 2055 } else { 2056 if (customVariants?.length > 1) { 2057 html += `<div class="elCustomSelect"><div class="elCustomSelectPreview"><span class="elCustomSelectPreviewText"><span class="elCustomSelectPreviewDirection" data-direction="Reactivate"></span><span class="elCustomSelectPreviewInfo">${variant?.name}</span></span><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div><select class="elVariantSelector">`; 2058 const c56 = product.variants; 2059 const fl57 = new CF2ForloopDrop(c56.length); 2060 for (const product_variant of c56) { 2061 const forloop2 = fl57; 2062 let combined_variant_name = ""; 2063 const c58 = product.sorted_property_values; 2064 const fl59 = new CF2ForloopDrop(c58.length); 2065 for (const property_values of c58) { 2066 const forloop3 = fl59; 2067 const index0 = forloop3?.index0; 2068 const property_id = property_values?.property_id; 2069 const property_value_id = product_variant?.property_value_ids?.[index0]; 2070 if (combined_variant_name != "") { 2071 combined_variant_name = combined_variant_name.toString().concat(", "); 2072 } 2073 combined_variant_name = combined_variant_name.toString().concat(product.all_properties[property_id]); 2074 combined_variant_name = combined_variant_name.toString().concat(": "); 2075 combined_variant_name = combined_variant_name.toString().concat(product.all_properties_values[property_value_id]); 2076 forloop3.next(); 2077 } 2078 html += `<option value="${product_variant?.property_value_ids}" `; 2079 if (product_variant?.id == variant?.id) { 2080 html += `selected`; 2081 } 2082 html += `>${combined_variant_name}</option>`; 2083 forloop2.next(); 2084 } 2085 html += `</select></div>`; 2086 } 2087 if (priceDisplayType == "single" && variant?.prices?.length > 1) { 2088 html += `<div class="elProductSelectSelectorsWrapper"><div class="elSelectWrapper"><select name="variant_price">`; 2089 const c60 = variant.prices; 2090 const fl61 = new CF2ForloopDrop(c60.length); 2091 for (const price of c60) {
2092 const forloop2 = fl61; 2093 html += `<option `; 2094 if (selected_price?.id == price?.id) { 2095 html += `selected`; 2096 } 2097 html += ` value="${price?.id}">${price?.name}</option>`; 2098 forloop2.next(); 2099 } 2100 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div></div>`; 2101 } 2102 } 2103 html += `</div>`; 2104 } 2105 html += `</div>`; 2106 forloop.next(); 2107 } 2108 html += `</div></div>`; 2109 if (can_purchase_again) { 2110 html += `<div class="elProductCardNewOrderWrapper"><div class="elProductCardTitle"><span>${otherTexts?.upgradesDowngradesReactivations?.purchaseAgain}</span><div></div></div><div class="elProductCardNewOrder`; 2111 if (newOrder == true) { 2112 html += ` elProductCardOrderSelected`; 2113 } 2114 html += `"><div class="elProductCardNewOrderTitle"><i class="fas fa-plus-circle"></i><span>${otherTexts?.upgradesDowngradesReactivations?.newOrder}</span></div>`; 2115 if (newOrder == true) { 2116 html += `<div class="elProductCardOrderActions">`; 2117 if (variantDisplay != "individual") { 2118 if (customVariants?.length > 1) { 2119 html += `<div class="elProductSelectSelectorsWrapper">`; 2120 const c62 = product.sorted_property_values; 2121 const fl63 = new CF2ForloopDrop(c62.length); 2122 for (const property_values of c62) { 2123 const forloop = fl63; 2124 const property_id = property_values?.property_id; 2125 const select_index = forloop?.index0; 2126 html += ` `; 2127 html += `<div class="elSelectWrapper"><select class="elVariantSelector" name="property_${property_id}">`; 2128 const c64 = property_values.value_ids; 2129 const fl65 = new CF2ForloopDrop(c64.length); 2130 for (const value_id of c64) { 2131 const forloop2 = fl65; 2132 html += `<option `; 2133 if (variant?.property_value_ids?.[select_index] == value_id) { 2134 html += `selected`; 2135 } 2136 html += ` value="${value_id}">${product?.all_properties_values?.[value_id]}</option>`; 2137 forloop2.next(); 2138 } 2139 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 2140 forloop.next(); 2141 } 2142 html += `</div>`; 2143 } 2144 } 2145 if (priceDisplayType == "single" && variant?.prices?.length > 1) { 2146 html += `<div class="elProductSelectSelectorsWrapper"><div class="elSelectWrapper"><select name="variant_price">`; 2147 const c66 = variant.prices; 2148 const fl67 = new CF2ForloopDrop(c66.length); 2149 for (const price of c66) { 2150 const forloop = fl67; 2151 html += `<option `; 2152 if (selected_price?.id == price?.id) { 2153 html += `selected`; 2154 } 2155 html += ` value="${price?.id}">${price?.name}</option>`; 2156 forloop.next(); 2157 } 2158 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div></div>`; 2159 } 2160 html += `</div>`; 2161 } 2162 html += `</div></div>`; 2163 } 2164 html += `</div>`; 2165 } 2166 } 2167 } 2168 } else {
2169 html += `<div class="elProductLayoutBackground"></div>`; 2170 if (selectType == "quantity") { 2171 html += `<div class="elProductInputWrapper elProductCardQuantityContainer"><div class="elProductInputControls"><button class="elProductCardInput">-</button><input class="elProductCardInput elProductCardShortInput" name="product" value="${quantity ?? 0}" min="0" type="number"/><button class="elProductCardInput">+</button></div></div>`; 2172 } else if (selectType == "quantity-forced") { 2173 html += `<div class="elProductInputWrapper elSelectWrapper elForcedQuantityWrapper"><select name="product" class="elProductCardInput elProductInputControls">`; 2174 const step = product?.step ?? 2; 2175 const min = product?.min ?? 0; 2176 const max = product?.max ?? 5; 2177 const item_count_step_1 = max - min; 2178 const item_count_step_2 = item_count_step_1 / step; 2179 const item_count_step_3 = item_count_step_2 | 0; 2180 const range = Array.apply(0, Array(item_count_step_3)).map((element, index) => index + 0); 2181 ; 2182 const c68 = range; 2183 const fl69 = new CF2ForloopDrop(c68.length); 2184 for (const i of c68) { 2185 const forloop = fl69; 2186 const value = i * step + min; 2187 html += `<option value="${value}">${value}</option>`; 2188 forloop.next(); 2189 } 2190 html += `</select><div class="elSelectArrow elForcedQuantitySelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 2191 } 2192 const isClassic = layout == "classic"; 2193 const isQuantityType = selectType == "quantity"; 2194 html += `<div class="elProductCardSelectInput`; 2195 if (isClassic == false || isQuantityType == true) { 2196 html += ` hide`; 2197 } 2198 html += `">`; 2199 if (selectType == "single") { 2200 if (isChecked) { 2201 html += `<div data-page-element="Radio/V1" class="elRadioWrapper id-Radio/V1" data-liquid-replace="item" data-checked="true" data-trigger-click-on-wrapper="false"><label class="elRadioLabel"><input type="radio" value="" name="product" checked class="elRadioInput"/><div class="elRadio"><div class="elRadioIcon"></div></div><span class="elRadioText"></span></label></div>`; 2202 } else { 2203 html += `<div data-page-element="Radio/V1" class="elRadioWrapper id-Radio/V1" data-liquid-replace="item" data-checked="" data-trigger-click-on-wrapper="false"><label class="elRadioLabel"><input type="radio" value="" name="product" class="elRadioInput"/><div class="elRadio"><div class="elRadioIcon"></div></div><span class="elRadioText"></span></label></div>`; 2204 } 2205 } else if (selectType == "multiple" || selectType == "quantity") { 2206 if (isChecked) { 2207 html += `<div data-page-element="Checkbox/V1" type="custom_type" class="elCheckboxWrapper elFormItemWrapper de-input-block id-Checkbox/V1" data-content="" data-liquid-replace="item" data-prevent-click-on-label="false" data-trigger-click-on-wrapper="false" data-checked="true"><label class="elCheckboxLabel"><input type="checkbox" value="${product?.id}" name="product" checked data-prevent-garlic="false" class="elCheckboxInput inputHolder"/><div class="elCheckbox"><div class="elCheckboxIcon"><div class="elCheckboxIconSquare hide"></div><i class="elCheckboxIconCheck fas fa-check"></i></div></div><span class="elCheckboxText"></span></label><div data-input-status-type="true" data-error-container="true"></div></div>`; 2208 } else { 2209 html += `<div data-page-element="Checkbox/V1" type="custom_type" class="elCheckboxWrapper elFormItemWrapper de-input-block id-Checkbox/V1" data-content="" data-liquid-replace="item" data-prevent-click-on-label="false" data-trigger-click-on-wrapper="false" data-checked=""><label class="elCheckboxLabel"><input type="checkbox" value="${product?.id}" name="product" data-prevent-garlic="false" class="elCheckboxInput inputHolder"/><div class="elCheckbox"><div class="elCheckboxIcon"><div class="elCheckboxIconSquare hide"></div><i class="elCheckboxIconCheck fas fa-check"></i></div></div><span class="elCheckboxText"></span></label><div data-input-status-type="true" data-error-container="true"></div></div>`; 2210 } 2211 } 2212 html += `</div>`; 2213 if (showImage) { 2214 const imageUrl = variant?.image ?? product.image; 2215 if (imageUrl && imageUrl != "") { 2216 html += `<div class="elProductCardImage"><div data-page-element="Image/V2" class="elImageWrapper de-image-block id-Image/V2`; 2217 if (CF2Blank(imageUrl) && CF2Blank(null) && true) { 2218 html += ` forceHide`; 2219 } 2220 html += `" data-liquid-replace="item">`; 2221 if (imageUrl || !CF2Blank(null)) { 2222 html += `<img class="elImage" src="${imageUrl ?? null}" data-lazy-loading="true" data-lazy-loading="true"/>`; 2223 } else if (false) { 2224 html += `<div class="image-placeholder" title=""><span class="image-placeholder-header"></span></div>`; 2225 } 2226 html += `</div></div>`; 2227 } 2228 } 2229 html += `<div class="elProductCardNameContainer">`; 2230 if (featured && highlight_text) { 2231 html += `<div class="elProductCardHighlight">${highlight_text}</div>`; 2232 } 2233 if (variantDisplay == "individual") { 2234 html += `<span class="elProductCardInfoName">${variant?.name}</span>`;
2235 } else if (customVariants?.length > 1) { 2236 html += `<span class="elProductCardInfoName">${product?.default_variant?.name}</span>`; 2237 } else { 2238 html += `<span class="elProductCardInfoName">${variant?.name}</span>`; 2239 } 2240 if (showDescription) { 2241 html += `<span class="elProductCardInfoDescription">${(product?.description_override ?? variant.description ?? product.default_variant.description ?? "").replaceAll(` 2242`, "<br>")}</span>`; 2243 } 2244 html += `</div>`; 2245 html += `<div class="elProductCardPriceContainer">`; 2246 if (priceDisplayType == "multiple") { 2247 if (variant?.prices?.length == 1) { 2248 html += `<div class="elProductCardInfoPrice">`; 2249 if (showCompareAtPrice) { 2250 const compare_at_amount = selected_price?.compare_at_amount; 2251 if (compare_at_amount) { 2252 html += `<span class="elProductCardAnchorPrice">${compare_at_amount}</span>`; 2253 } 2254 } 2255 html += `<span class="elProductCardFinalPrice">
2255${selected_price?.name}</span></div>`; 2256 } else { 2257 html += `<div class="elSelectWrapper"><select name="variant_price">`; 2258 const c70 = variant.prices; 2259 const fl71 = new CF2ForloopDrop(c70.length); 2260 for (const price of c70) { 2261 const forloop = fl71; 2262 html += `<option `; 2263 if (selected_price?.id == price?.id) { 2264 html += `selected`; 2265 } 2266 html += ` value="${price?.id}">${price?.name}</option>`; 2267 forloop.next(); 2268 } 2269 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 2270 } 2271 } else if (priceDisplayType == "single") { 2272 html += `<div class="elProductCardInfoPrice">`; 2273 if (showCompareAtPrice) { 2274 const compare_at_amount = selected_price?.compare_at_amount; 2275 if (compare_at_amount) { 2276 html += `<span class="elProductCardAnchorPrice">${compare_at_amount}</span>`;
2277 } 2278 } 2279 html += `<span class="elProductCardFinalPrice">${selected_price?.name}</span></div>`; 2280 } 2281 html += `</div>`; 2282 if (showProductVariantSelection && variantDisplay != "individual") { 2283 if (customVariants?.length > 1) { 2284 html += `<div class="elProductSelectSelectorsWrapper">`; 2285 const c72 = product.sorted_property_values; 2286 const fl73 = new CF2ForloopDrop(c72.length); 2287 for (const property_values of c72) { 2288 const forloop = fl73; 2289 const property_id = property_values?.property_id; 2290 const select_index = forloop?.index0; 2291 html += ` `; 2292 html += `<div class="elSelectWrapper"><select class="elVariantSelector" name="property_${property_id}">`; 2293 const c74 = property_values.value_ids; 2294 const fl75 = new CF2ForloopDrop(c74.length); 2295 for (const value_id of c74) { 2296 const forloop2 = fl75; 2297 html += `<option `; 2298 if (variant?.property_value_ids?.[select_index] == value_id) { 2299 html += `selected`; 2300 } 2301 html += ` value="${value_id}">${product?.all_properties_values?.[value_id]}</option>`; 2302 forloop2.next(); 2303 } 2304 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 2305 forloop.next(); 2306 } 2307 html += `</div>`; 2308 } 2309 } 2310 if (showManageOrders) { 2311 const amount_of_orders = updatableOrders?.length; 2312 if (amount_of_orders && amount_of_orders > 0) { 2313 if (variantDisplay == "individual") { 2314 const isCurrentPlan = individualDirection == "current"; 2315 if (isCurrentPlan) { 2316 html += `<div class="elProductCardSubscriptionsBanner"><i class="fas fa-sync-alt"></i><span>Current plan</span>`; 2317 if (can_purchase_again) { 2318 html += `<span class="elProductCardCurrentPlanSeparator">-</span>`; 2319 html += `<div class="elProductCardNewOrder elProductCardPurchaseAgainInline"><span>Purchase Again</span></div>`; 2320 } 2321 html += `</div>`; 2322 } else { 2323 html += `<div class="elProductCardSubscriptionsBanner"><i class="fas fa-sync-alt"></i><span>${individualDirection}</span></div>`; 2324 html += `<div class="elProductCardManageOrders`; 2325 if (CF2Blank(isChecked)) { 2326 html += ` elHide`; 2327 } 2328 html += `"><div class="elProductCardOrdersWrapper"><div class="elProductCardTitle"><span>${individualDirection} </span><div></div></div><div class="elProductCardOrders">`; 2329 const c76 = updatableOrders; 2330 const fl77 = new CF2ForloopDrop(c76.length); 2331 for (const order of c76) { 2332 const forloop = fl77; 2333 const orderIndex = forloop?.index0; 2334 html += `<div class="elProductCardOrder`; 2335 if (selectedOrderIndex == orderIndex) { 2336 html += ` elProductCardOrderSelected`; 2337 } 2338 html += `" data-order-index="${orderIndex}"><div class="elProductCardOrderDetails"><div class="elProductCardOrderDetailsNumber"><i class="fas fa-receipt"></i><span>${otherTexts?.upgradesDowngradesReactivations?.order} ${order?.number}</span></div><span class="elProductCardOrderDetailsManage">${individualDirection}</span></div>`; 2339 if (selectedOrderIndex == orderIndex) { 2340 html += `<div class="elProductCardOrderActions"><a data-page-element="LinkNode" class="elTypographyLink elProductCardShowOrderDetailsLink id-LinkNode" href="#show-selected-order-details" target="_self" data-show-button-ids="" data-hide-button-ids="" data-selected="${false}" data-liquid-replace="item"><span>${otherTexts?.upgradesDowngradesReactivations?.viewOrderDetails}</span></a><span class="elProductCardDirectionBadge">${individualDirection} ${variant?.name}
2340 - ${selected_price?.name}</span></div>`; 2341 } 2342 html += `</div>`; 2343 forloop.next(); 2344 } 2345 html += `</div></div>`; 2346 if (can_purchase_again) { 2347 html += `<div class="elProductCardNewOrderWrapper"><div class="elProductCardTitle"><span>${otherTexts?.upgradesDowngradesReactivations?.purchaseAgain}</span><div></div></div><div class="elProductCardNewOrder`; 2348 if (newOrder == true) { 2349 html += ` elProductCardOrderSelected`; 2350 } 2351 html += `"><div class="elProductCardNewOrderTitle"><i class="fas fa-plus-circle"></i><span>${otherTexts?.upgradesDowngradesReactivations?.newOrder}</span></div>`; 2352 if (newOrder == true) { 2353 html += `<div class="elProductCardOrderActions">`; 2354 if (variantDisplay != "individual") { 2355 if (customVariants?.length > 1) { 2356 html += `<div class="elProductSelectSelectorsWrapper">`; 2357 const c78 = product.sorted_property_values; 2358 const fl79 = new CF2ForloopDrop(c78.length); 2359 for (const property_values of c78) { 2360 const forloop = fl79; 2361 const property_id = property_values?.property_id; 2362 const select_index = forloop?.index0; 2363 html += ` `; 2364 html += `<div class="elSelectWrapper"><select class="elVariantSelector" name="property_${property_id}">`; 2365 const c80 = property_values.value_ids; 2366 const fl81 = new CF2ForloopDrop(c80.length); 2367 for (const value_id of c80) { 2368 const forloop2 = fl81; 2369 html += `<option `; 2370 if (variant?.property_value_ids?.[select_index] == value_id) { 2371 html += `selected`; 2372 } 2373 html += ` value="${value_id}">${product?.all_properties_values?.[value_id]}</option>`; 2374 forloop2.next(); 2375 } 2376 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 2377 forloop.next(); 2378 } 2379 html += `</div>`; 2380 } 2381 } 2382 if (priceDisplayType == "single" && variant?.prices?.length > 1) { 2383 html += `<div class="elProductSelectSelectorsWrapper"><div class="elSelectWrapper"><select name="variant_price">`; 2384 const c82 = variant.prices; 2385 const fl83 = new CF2ForloopDrop(c82.length); 2386 for (const price of c82) { 2387 const forloop = fl83; 2388 html += `<option `; 2389 if (selected_price?.id == price?.id) { 2390 html += `selected`; 2391 } 2392 html += ` value="${price?.id}">${price?.name}</option>`; 2393 forloop.next(); 2394 } 2395 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div></div>`; 2396 } 2397 html += `</div>`; 2398 } 2399 html += `</div></div>`; 2400 } 2401 html += `</div>`; 2402 } 2403 } else { 2404 let active_order = false; 2405 let canceled_order = false; 2406 const amount_of_orders2 = updatableOrders?.length; 2407 const c84 = updatableOrders; 2408 const fl85 = new CF2ForloopDrop(c84.length); 2409 for (const order of c84) { 2410 const forloop = fl85; 2411 if (order?.type == "reactivate") { 2412 canceled_order = true; 2413 } else { 2414 active_order = true; 2415 } 2416 forloop.next(); 2417 } 2418 html += `<div class="elProductCardSubscriptionsBanner"><i class="fas fa-sync-alt"></i>`; 2419 if (active_order && canceled_order) { 2420 if (amount_of_orders2 > 1) { 2421 html += `<span>${amount_of_orders2} ${otherTexts?.upgradesDowngradesReactivations?.multipleExistingSubscriptions}</span>`;
2422 } else { 2423 html += `<span>${amount_of_orders2} ${otherTexts?.upgradesDowngradesReactivations?.singleExistingSubscription}</span>`; 2424 } 2425 } else if (canceled_order) { 2426 if (amount_of_orders2 > 1) { 2427 html += `<span>${amount_of_orders2} </span>`; 2428 } else { 2429 html += `<span>${amount_of_orders2} </span>`; 2430 } 2431 } else { 2432 if (amount_of_orders2 > 1) { 2433 html += `<span>${amount_of_orders2} ${otherTexts?.upgradesDowngradesReactivations?.multipleActiveSubscriptions}</span>`; 2434 } else { 2435 html += `<span>${amount_of_orders2} ${otherTexts?.upgradesDowngradesReactivations?.singleActiveSubscription}</span>`; 2436 } 2437 } 2438 html += `</div>`; 2439 html += `<div class="elProductCardManageOrders`; 2440 if (CF2Blank(isChecked)) { 2441 html += ` elHide`; 2442 } 2443 html += `"><div class="elProductCardOrdersWrapper"><div class="elProductCardTitle"><span>${otherTexts?.upgradesDowngradesReactivations?.manageSubscriptions}</span><div></div></div><div class="elProductCardOrders">`; 2444 const c86 = updatableOrders; 2445 const fl87 = new CF2ForloopDrop(c86.length); 2446 for (const order of c86) { 2447 const forloop = fl87; 2448 const orderIndex = forloop?.index0; 2449 html += `<div class="elProductCardOrder`; 2450 if (selectedOrderIndex == orderIndex) { 2451 html += ` elProductCardOrderSelected`; 2452 } 2453 html += `" data-order-index="${orderIndex}"><div class="elProductCardOrderDetails"><div class="elProductCardOrderDetailsNumber"><i class="fas fa-receipt"></i><span>${otherTexts?.upgradesDowngradesReactivations?.order} ${order?.number}</span></div>`; 2454 if (order?.type == "reactivate") { 2455 html += `<span class="elProductCardOrderDetailsReactivate"></span>`; 2456 } else { 2457 html += `<span class="elProductCardOrderDetailsManage">${otherTexts?.upgradesDowngradesReactivations?.manage}</span>`; 2458 } 2459 html += `</div>`; 2460 if (selectedOrderIndex == orderIndex) { 2461 html += `<div class="elProductCardOrderActions"><a data-page-element="LinkNode" class="elTypographyLink elProductCardShowOrderDetailsLink id-LinkNode" href="#show-selected-order-details" target="_self" data-show-button-ids="" data-hide-button-ids="" data-selected="${false}" data-liquid-replace="item"><span>${otherTexts?.upgradesDowngradesReactivations?.viewOrderDetails}</span></a>`; 2462 if (order?.type == "upgradeDowngrade") { 2463 const updatableItem = order?.updatableItems?.[selectedUpdatableCartItemIndex]; 2464 html += `<div class="elCustomSelect"><div class="elCustomSelectPreview"><span class="elCustomSelectPreviewText"><span class="elCustomSelectPreviewDirection" data-direction="${updatableItem?.direction}">${updatableItem?.direction} </span><span class="elCustomSelectPreviewInfo">${updatableItem?.variantName} - ${updatableItem?.priceName}</span></span><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div><select name="upgradeDowngrade">`; 2465 const c88 = order.updatableItems; 2466 const fl89 = new CF2ForloopDrop(c88.length); 2467 for (const updatableItem2 of c88) { 2468 const forloop2 = fl89; 2469 const index = forloop2?.index0; 2470 html += `<option `; 2471 if (index == selectedUpdatableCartItemIndex) { 2472 html += `selected`; 2473 } 2474 html += ` value="${index}">${updatableItem2?.direction} ${updatableItem2?.variantName} - ${updatableItem2?.priceName}</option>`; 2475 forloop2.next(); 2476 } 2477 html += `</select></div>`; 2478 } else { 2479 if (customVariants?.length > 1) { 2480 html += `<div class="elCustomSelect"><div class="elCustomSelectPreview"><span class="elCustomSelectPreviewText"><span class="elCustomSelectPreviewDirection" data-direction="Reactivate"></span><span class="elCustomSelectPreviewInfo">${variant?.name}</span></span><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div><select class="elVariantSelector">`; 2481 const c90 = product.variants; 2482 const fl91 = new CF2ForloopDrop(c90.length); 2483 for (const product_variant of c90) { 2484 const forloop2 = fl91; 2485 let combined_variant_name = ""; 2486 const c92 = product.sorted_property_values; 2487 const fl93 = new CF2ForloopDrop(c92.length); 2488 for (const property_values of c92) { 2489 const forloop3 = fl93; 2490 const index0 = forloop3?.index0; 2491 const property_id = property_values?.property_id; 2492 const property_value_id = product_variant?.property_value_ids?.[index0]; 2493 if (combined_variant_name != "") { 2494 combined_variant_name = combined_variant_name.toString().concat(", "); 2495 } 2496 combined_variant_name = combined_variant_name.toString().concat(product.all_properties[property_id]); 2497 combined_variant_name = combined_variant_name.toString().concat(": "); 2498 combined_variant_name = combined_variant_name.toString().concat(product.all_properties_values[property_value_id]); 2499 forloop3.next(); 2500 } 2501 html += `<option value="${product_variant?.property_value_ids}" `; 2502 if (product_variant?.id == variant?.id) { 2503 html += `selected`; 2504 } 2505 html += `>${combined_variant_name}</option>`; 2506 forloop2.next(); 2507 } 2508 html += `</select></div>`; 2509 } 2510 if (priceDisplayType == "single" && variant?.prices?.length > 1) { 2511 html += `<div class="elProductSelectSelectorsWrapper"><div class="elSelectWrapper"><select name="variant_price">`; 2512 const c94 = variant.prices; 2513 const fl95 = new CF2ForloopDrop(c94.length); 2514 for (const price of c94) { 2515 const forloop2 = fl95; 2516 html += `<option `; 2517 if (selected_price?.id == price?.id) { 2518 html += `selected`; 2519 } 2520 html += ` value="${price?.id}">${price?.name}</option>`; 2521 forloop2.next(); 2522 } 2523 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div></div>`; 2524 } 2525 } 2526 html += `</div>`; 2527 } 2528 html += `</div>`; 2529 forloop.next(); 2530 } 2531 html += `</div></div>`; 2532 if (can_purchase_again) { 2533 html += `<div class="elProductCardNewOrderWrapper"><div class="elProductCardTitle"><span>${otherTexts?.upgradesDowngradesReactivations?.purchaseAgain}</span><div></div></div><div class="elProductCardNewOrder`; 2534 if (newOrder == true) { 2535 html += ` elProductCardOrderSelected`; 2536 } 2537 html += `"><div class="elProductCardNewOrderTitle"><i class="fas fa-plus-circle"></i><span>${otherTexts?.upgradesDowngradesReactivations?.newOrder}</span></div>`; 2538 if (newOrder == true) { 2539 html += `<div class="elProductCardOrderActions">`; 2540 if (variantDisplay != "individual") { 2541 if (customVariants?.length > 1) { 2542 html += `<div class="elProductSelectSelectorsWrapper">`; 2543 const c96 = product.sorted_property_values; 2544 const fl97 = new CF2ForloopDrop(c96.length); 2545 for (const property_values of c96) { 2546 const forloop = fl97; 2547 const property_id = property_values?.property_id; 2548 const select_index = forloop?.index0; 2549 html += ` `; 2550 html += `<div class="elSelectWrapper"><select class="elVariantSelector" name="property_${property_id}">`; 2551 const c98 = property_values.value_ids; 2552 const fl99 = new CF2ForloopDrop(c98.length); 2553 for (const value_id of c98) { 2554 const forloop2 = fl99; 2555 html += `<option `; 2556 if (variant?.property_value_ids?.[select_index] == value_id) { 2557 html += `selected`; 2558 } 2559 html += ` value="${value_id}">${product?.all_properties_values?.[value_id]}</option>`; 2560 forloop2.next(); 2561 } 2562 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 2563 forloop.next(); 2564 } 2565 html += `</div>`; 2566 } 2567 } 2568 if (priceDisplayType == "single" && variant?.prices?.length > 1) { 2569 html += `<div class="elProductSelectSelectorsWrapper"><div class="elSelectWrapper"><select name="variant_price">`; 2570 const c100 = variant.prices; 2571 const fl101 = new CF2ForloopDrop(c100.length); 2572 for (const price of c100) { 2573 const forloop = fl101; 2574 html += `<option `; 2575 if (selected_price?.id == price?.id) { 2576 html += `selected`; 2577 } 2578 html += ` value="${price?.id}">${price?.name}</option>`; 2579 forloop.next(); 2580 } 2581 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div></div>`; 2582 } 2583 html += `</div>`; 2584 } 2585 html += `</div></div>`; 2586 } 2587 html += `</div>`; 2588 } 2589 } 2590 } 2591 } 2592 } 2593 this.replaceContent(html); 2594 if (initializeChildrenInstances) { 2595 const scopeToYggRender = this.element.querySelectorAll("[ygg-render]").length > 0; 2596 const options = { scopeToYggRender }; 2597 CF2Component.hydrateTree(this.element, options); 2598 } 2599 } 2600}; 2601registerComponent("CheckoutProductCard/V2", CheckoutProductCardV2); 2602window["CheckoutProductCardV2"] = CheckoutProductCardV2; 2603
2604// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-product-select-v2.ts 2605init_define_process(); 2606
2607// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/CheckoutProductSelect/V2/checkoutProductSelect.ts 2608init_define_process(); 2609init_general(); 2610init_nanostores(); 2611init_addToCart(); 2612
2613// projects/lib/packages/yggdrasil-liquidjs/src/shared/index.ts 2614init_define_process(); 2615
2616// projects/lib/packages/yggdrasil-liquidjs/src/shared/product.ts 2617init_define_process(); 2618function get_available_variant(product) { 2619 if (product?.sorted_property_values?.length) { 2620 const allOrderedVariantCombinations = product.sorted_property_values.map((p) => p.value_ids).reduce((a, b) => a.reduce((r, v) => r.concat(b.map((w) => [].concat(v, w))), [])); 2621 const availableCombination = allOrderedVariantCombinations?.find((combination) => { 2622 const availableCombinationIdentifier = Array.isArray(combination) ? combination.join(",") : combination; 2623 return product.property_values_variant_mapping[availableCombinationIdentifier]; 2624 }); 2625 const variantId = product.property_values_variant_mapping[availableCombination]; 2626 return product.variants.find((v) => v.id === String(variantId)) ?? product.variants?.[0]; 2627 } 2628 return product?.variants?.[0]; 2629} 2630
2631// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/CheckoutProductSelect/V2/checkoutProductSelect.ts 2632var registerProductEventListeners = (pcc) => { 2633 registerUpdatableOrders(pcc); 2634 registerVariantEventListeners(pcc); 2635}; 2636var updateCardByProductIdState = (key, data) => { 2637 const oldState = productCardByProductId.get()[key]; 2638 const newState = cleanEmptyObjectKeys({ ...oldState, ...data }); 2639 productCardByProductId.setKey(key, newState); 2640 const productId = key.includes(":") ? key.split(":")[0] : key; 2641 updateProductCarousel(productId, newState.variantId); 2642}; 2643var unselectAllProducts = () => { 2644 for (const [productId, oldState] of Object.entries(productCardByProductId.get())) { 2645 const newState = cleanEmptyObjectKeys({ ...oldState, quantity: 0 }); 2646 productCardByProductId.setKey(productId, newState); 2647 } 2648}; 2649var updateProductCarousel = (productId, variantId) => { 2650 document.dispatchEvent( 2651 new CustomEvent("ProductCarousel:Update", { 2652 detail: { 2653 productId, 2654 variantId 2655 } 2656 }) 2657 ); 2658}; 2659var getCompositeKeysForProduct = (productId) => { 2660 const state = productCardByProductId.get(); 2661 return Object.keys(state).filter((k) => k.startsWith(`${productId}:`)); 2662}; 2663var getCardStateKey = (pcc) => { 2664 if (pcc.individualVariantId) { 2665 return `${pcc.product.id}:${pcc.individualVariantId}`; 2666 } 2667 return pcc.product.id; 2668}; 2669var initIndividualVariantState = () => { 2670 const currentState = productCardByProductId.get(); 2671 const products = globalThis.globalResourceData.products?.filter((p) => !p.bump) ?? []; 2672 for (const product of products) { 2673 const customVariants = product.variants.filter((v) => !v.default_variant); 2674 if (customVariants.length <= 1) continue; 2675 const firstCompositeKey = `${product.id}:${customVariants[0].id}`; 2676 if (currentState[firstCompositeKey] !== void 0) continue; 2677 const existingEntry = currentState[product.id]; 2678 for (const variant of customVariants) { 2679 const compositeKey = `${product.id}:${variant.id}`; 2680 const isSelected = existingEntry?.variantId == variant.id; 2681 productCardByProductId.setKey(compositeKey, { 2682 variantId: variant.id, 2683 priceId: variant.prices[0]?.id, 2684 quantity: isSelected ? existingEntry.quantity : 0 2685 }); 2686 } 2687 productCardByProductId.setKey(product.id, { 2688 variantId: existingEntry?.variantId, 2689 priceId: existingEntry?.priceId, 2690 quantity: 0 2691 }); 2692 } 2693}; 2694var getProductCardByProductId = () => { 2695 const productCardByProductId2 = globalThis.globalResourceData.products?.reduce((acc, product) => { 2696 const variant = get_available_variant(product); 2697 const price = variant.prices[0]; 2698 acc[product.id] = { 2699 variantId: variant.id, 2700 priceId: price.id, 2701 quantity: 0 2702 }; 2703 return acc; 2704 }, {}); 2705 const productVariantWithNoBump = globalThis.globalResourceData.productVariantWithNoBump; 2706 let selectedVariantId, selectedPriceId, selectedProductId; 2707 if (productVariantWithNoBump) { 2708 selectedProductId = productVariantWithNoBump.product_id; 2709 selectedVariantId = productVariantWithNoBump.id; 2710 selectedPriceId = productVariantWithNoBump.prices?.[0].id; 2711 } 2712 const productCardItem = productCardByProductId2[selectedProductId]; 2713 if (productCardItem) { 2714 const product = globalThis.globalResourceData.products?.find((p) => p.id === selectedProductId); 2715 const variant = product?.variants?.find((variant2) => variant2.id === selectedVariantId); 2716 if (variant) { 2717 const price = variant?.prices?.find((price2) => price2.id === selectedPriceId); 2718 if (price) { 2719 productCardByProductId2[selectedProductId] = { 2720 variantId: variant.id, 2721 priceId: price.id, 2722 quantity: 1 2723 }; 2724 } 2725 } 2726 } 2727 return productCardByProductId2; 2728}; 2729var productCardByProductId = map(getProductCardByProductId()); 2730var sameItem = (v1, v2) => v1.type == v2.type && v1.line_item_id == v2.line_item_id && v1.product_id == v2.product_id && v1.variant_id == v2.variant_id && v1.price_id == v2.price_id && v1.quantity == v2.quantity; 2731var calculateCart = (prevCart, productCardByProductId2) => { 2732 if (globalThis.globalResourceData.cart) return structuredClone(globalThis.globalResourceData.cart); 2733 let order_id; 2734 const items = Object.entries(productCardByProductId2).filter(([, v]) => v && v.quantity > 0).map(([key, v]) => { 2735 order_id = order_id ?? v.cartItemOrderId; 2736 const productId = key.includes(":") ? key.split(":")[0] : key; 2737 return { 2738 type: v.cartItemRenderType, 2739 line_item_id: v.cartItemLineItemId, 2740 product_id: productId, 2741 variant_id: v.variantId, 2742 price_id: v.priceId, 2743 quantity: v.quantity 2744 }; 2745 }); 2746 const nextCart = { 2747 order_id, 2748 items 2749 }; 2750 const isEqual2 = prevCart.cart && prevCart.cart.order_id == nextCart.order_id && prevCart.cart.items.length == nextCart.items.length && prevCart.cart.items.every((oldItem, idx) => sameItem(oldItem, nextCart.items[idx])); 2751 if (!isEqual2) { 2752 prevCart.cart = nextCart; 2753 } 2754 return prevCart.cart; 2755}; 2756var buildProductSelectComputed = () => { 2757 const prevCart = { cart: null }; 2758 return computed( 2759 productCardByProductId, 2760 (productCardByProductId2) => calculateCart(prevCart, productCardByProductId2) 2761 ); 2762}; 2763var buildProductSelectBatched = () => { 2764 const prevCart = { cart: null }; 2765 return batched( 2766 productCardByProductId, 2767 (productCardByProductId2) => calculateCart(prevCart, productCardByProductId2) 2768 ); 2769};
2770var anyUpdatableOrders = () => { 2771 return Object.values(productCardByProductId.get()).some((v) => v.updatableOrders); 2772}; 2773var registerOneTimeCardElementListeners = (productCardComponents, onMountCallback) => { 2774 productCardComponents.forEach((pcc) => { 2775 renderPcc(pcc, onMountCallback); 2776 }); 2777 productCardByProductId.listen(() => { 2778 productCardComponents.forEach((pcc) => { 2779 renderPcc(pcc, onMountCallback); 2780 }); 2781 }); 2782 productCardComponents.forEach((pcc) => { 2783 const element = pcc.element; 2784 element.addEventListener("click", (evt) => { 2785 if (pcc.selectType == "quantity") return; 2786 const button = evt.target.closest("a"); 2787 if (button && !button.closest(".elProductCardModernButton")) return; 2788 const cardKey = getCardStateKey(pcc); 2789 if (pcc.selectType == "single") { 2790 for (const otherPcc of productCardComponents) { 2791 if (otherPcc == pcc || !otherPcc.isChecked) continue; 2792 updateCardByProductIdState(getCardStateKey(otherPcc), { quantity: 0 }); 2793 } 2794 if (pcc.id.includes("Bump")) { 2795 if (pcc.isChecked) { 2796 updateCardByProductIdState(cardKey, { quantity: 0 }); 2797 } else { 2798 updateCardByProductIdState(cardKey, { quantity: 1 }); 2799 } 2800 } else { 2801 updateCardByProductIdState(cardKey, { quantity: 1 }); 2802 } 2803 } else if (pcc.selectType == "multiple") { 2804 if (pcc.isChecked) { 2805 updateCardByProductIdState(cardKey, { quantity: 0 }); 2806 } else { 2807 updateCardByProductIdState(cardKey, { quantity: 1 }); 2808 } 2809 } 2810 }); 2811 }); 2812}; 2813var registerEventListeners = (pcc, onMountCallback) => { 2814 registerPriceEventListeners(pcc); 2815 if (onMountCallback) onMountCallback(pcc); 2816 if (pcc.selectType == "quantity") { 2817 registerQuantityEventListeners(pcc); 2818 } 2819}; 2820var registerVariantEventListeners = (pcc) => { 2821 const element = pcc.element; 2822 const variantSelects = element.querySelectorAll(".elVariantSelector"); 2823 variantSelects.forEach((select, index) => { 2824 select.addEventListener("click", (evt) => { 2825 evt.stopImmediatePropagation(); 2826 evt.stopPropagation(); 2827 evt.preventDefault(); 2828 }); 2829 select.addEventListener("change", (evt) => { 2830 evt.stopImmediatePropagation(); 2831 evt.stopPropagation(); 2832 evt.preventDefault(); 2833 const newValues = [...variantSelects].map((e) => e.value); 2834 const selectedVariantId = getSelectedVariant(pcc, index, newValues); 2835 const newVariant = pcc.product.variants.find((v) => v.id == String(selectedVariantId)); 2836 const newPrice = newVariant.prices[0]; 2837 updateCardByProductIdState(getCardStateKey(pcc), { 2838 variantId: newVariant.id, 2839 priceId: newPrice.id 2840 }); 2841 }); 2842 }); 2843}; 2844var registerUpdatableOrders = (pcc) => { 2845 const element = pcc.element; 2846 const previousOrders = element.querySelectorAll(".elProductCardOrder"); 2847 const newOrder = element.querySelector(".elProductCardNewOrder"); 2848 previousOrders?.forEach((orderElement) => { 2849 const showOrderDetailsLink = orderElement.querySelector(".elProductCardShowOrderDetailsLink"); 2850 const upgradeAndDowngradeSelector = orderElement.querySelector('[name="upgradeDowngrade"]'); 2851 const orderIndex = Number(orderElement.getAttribute("data-order-index")); 2852 const order = pcc.updatableOrders[orderIndex]; 2853 orderElement.addEventListener("click", (evt) => { 2854 evt.stopImmediatePropagation(); 2855 evt.stopPropagation(); 2856 evt.preventDefault(); 2857 const cardKey = getCardStateKey(pcc); 2858 const renderType = order.type; 2859 const cardDetails = pcc.updatableOrders[orderIndex].updatableItems[0].cardDetails; 2860 const updateCardNewState = { 2861 selectedOrderIndex: orderIndex, 2862 selectedUpdatableCartItemIndex: 0, 2863 renderType, 2864 variantId: cardDetails.variantId, 2865 priceId: cardDetails.priceId, 2866 cartItemRenderType: renderType, 2867 cartItemOrderId: cardDetails.orderId, 2868 cartItemLineItemId: cardDetails.lineItemId 2869 }; 2870 updateCardByProductIdState(cardKey, updateCardNewState); 2871 }); 2872 showOrderDetailsLink?.addEventListener("click", (evt) => { 2873 evt.stopImmediatePropagation(); 2874 evt.stopPropagation(); 2875 evt.preventDefault(); 2876 globalThis.Checkout.store.selectedOrderDetailId.set(order.id); 2877 }); 2878 upgradeAndDowngradeSelector?.addEventListener("click", (evt) => { 2879 evt.preventDefault(); 2880 evt.stopImmediatePropagation(); 2881 evt.stopPropagation(); 2882 }); 2883 upgradeAndDowngradeSelector?.addEventListener("change", (evt) => { 2884 evt.stopImmediatePropagation(); 2885 evt.stopPropagation(); 2886 evt.preventDefault(); 2887 const updatableItemIndex = Number(evt.target.value);
2888 const cardDetails = order.updatableItems[updatableItemIndex].cardDetails; 2889 const updateCardNewState = { 2890 selectedUpdatableCartItemIndex: updatableItemIndex, 2891 variantId: cardDetails.variantId, 2892 priceId: cardDetails.priceId, 2893 cartItemOrderId: cardDetails.orderId, 2894 cartItemLineItemId: cardDetails.lineItemId 2895 }; 2896 updateCardByProductIdState(getCardStateKey(pcc), updateCardNewState); 2897 }); 2898 }); 2899 newOrder?.addEventListener("click", () => { 2900 const variant = pcc.individualVariantId ? pcc.product.variants.find((v) => v.id == pcc.individualVariantId) ?? pcc.product.variants[0] : pcc.product.variants[0]; 2901 const variantId = variant.id; 2902 const priceId = variant.prices[0].id; 2903 const updateCardNewState = { 2904 variantId, 2905 priceId, 2906 selectedOrderIndex: -1, 2907 selectedUpdatableCartItemIndex: 0, 2908 cartItemRenderType: void 0, 2909 cartItemOrderId: void 0, 2910 cartItemLineItemId: void 0 2911 }; 2912 updateCardByProductIdState(getCardStateKey(pcc), updateCardNewState); 2913 }); 2914}; 2915var registerPriceEventListeners = (pcc) => { 2916 const element = pcc.element; 2917 const variantPriceSelector = element.querySelector('[name="variant_price"]'); 2918 variantPriceSelector?.addEventListener("click", (evt) => { 2919 evt.preventDefault(); 2920 evt.stopImmediatePropagation(); 2921 evt.stopPropagation(); 2922 }); 2923 variantPriceSelector?.addEventListener("change", (evt) => { 2924 evt.stopImmediatePropagation(); 2925 evt.stopPropagation(); 2926 evt.preventDefault(); 2927 const newPriceId = Number(evt.target.value); 2928 updateCardByProductIdState(getCardStateKey(pcc), { priceId: newPriceId }); 2929 }); 2930}; 2931var registerQuantityEventListeners = (pcc) => { 2932 const element = pcc.element; 2933 const [minusButton, plusButton] = element.querySelectorAll(".elProductInputControls button"); 2934 const input = element.querySelector(".elProductInputControls input"); 2935 minusButton.addEventListener("click", (evt) => { 2936 evt.preventDefault(); 2937 if (pcc.quantity === 0) return; 2938 const newQuantity = pcc.quantity - 1; 2939 updateCardByProductIdState(getCardStateKey(pcc), { quantity: newQuantity }); 2940 }); 2941 plusButton.addEventListener("click", (evt) => { 2942 evt.preventDefault(); 2943 const newQuantity = pcc.quantity + 1; 2944 updateCardByProductIdState(getCardStateKey(pcc), { quantity: newQuantity }); 2945 }); 2946 input.addEventListener("blur", (evt) => { 2947 const newQuantity = parseInt(evt.target.value); 2948 if (newQuantity == 0 || isNaN(newQuantity)) { 2949 updateCardByProductIdState(getCardStateKey(pcc), { quantity: 0 }); 2950 } else { 2951 updateCardByProductIdState(getCardStateKey(pcc), { quantity: newQuantity }); 2952 } 2953 }); 2954}; 2955var renderAndMount = (pcc, onMountCallback) => { 2956 if (pcc.id.includes("Bump")) { 2957 pcc.renderAndMount(); 2958 registerPriceEventListeners(pcc); 2959 } else { 2960 pcc.render(); 2961 } 2962 if (pcc.skipMountOnRender) return; 2963 registerEventListeners(pcc, onMountCallback); 2964}; 2965var renderPcc = (pcc, onMountCallback) => { 2966 const stateKey = getCardStateKey(pcc); 2967 const updates = productCardByProductId.get()[stateKey]; 2968 if (!updates) return; 2969 let newSelectType; 2970 if (anyUpdatableOrders()) { 2971 newSelectType = "single"; 2972 } else if (!pcc.product.bump) { 2973 newSelectType = globalThis.globalResourceData.product_quantity_type ?? "single"; 2974 } else { 2975 newSelectType = pcc.selectType; 2976 } 2977 if (pcc.renderType == updates.renderType && pcc.variant.id == updates.variantId && pcc.selected_price.id == updates.priceId && pcc.quantity == updates.quantity && pcc.selectType == newSelectType && pcc.selectedOrderIndex == updates.selectedOrderIndex && pcc.selectedUpdatableCartItemIndex == updates.selectedUpdatableCartItemIndex && pcc.updatableOrders == updates.updatableOrders && pcc.individualDirection == updates.individualDirection) 2978 return; 2979 pcc.renderType = updates.renderType; 2980 pcc.variant = globalThis.globalResourceData.variantsById[updates.variantId]; 2981 pcc.selected_price = globalThis.globalResourceData.pricesById[updates.priceId]; 2982 pcc.quantity = updates.quantity; 2983 pcc.selectType = newSelectType; 2984 pcc.selectedOrderIndex = updates.selectedOrderIndex; 2985 pcc.selectedUpdatableCartItemIndex = updates.selectedUpdatableCartItemIndex; 2986 pcc.updatableOrders = updates.updatableOrders; 2987 pcc.individualDirection = updates.individualDirection; 2988 pcc.isChecked = updates.quantity > 0; 2989 if (pcc.isChecked) { 2990 pcc.element.classList.add("elProductSelected"); 2991 } else { 2992 pcc.element.classList.remove("elProductSelected"); 2993 } 2994 renderAndMount(pcc, onMountCallback); 2995}; 2996
2997// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-product-select-v2.ts 2998init_runtime(); 2999var CheckoutProductSelectV2 = class extends CF2Component { 3000 constructor(el, runtimeSel) { 3001 super(el, runtimeSel); 3002 } 3003 mount() { 3004 const productCardComponents = this.getComponents("CheckoutProductCard/V2"); 3005 registerOneTimeCardElementListeners(productCardComponents, (pcc) => { 3006 registerProductEventListeners(pcc); 3007 }); 3008 productCardComponents.forEach((pcc) => { 3009 registerEventListeners(pcc, (pcc2) => { 3010 registerProductEventListeners(pcc2); 3011 }); 3012 }); 3013 } 3014}; 3015registerComponent("CheckoutProductSelect/V2", CheckoutProductSelectV2); 3016window["CheckoutProductSelectV2"] = CheckoutProductSelectV2; 3017
3018// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-product-card-bump-v2.ts 3019init_define_process(); 3020init_checkbox_v1(); 3021init_runtime(); 3022var CheckoutProductCardBumpV2 = class extends CF2Component { 3023 constructor(el, runtimeSel) { 3024 super(el, runtimeSel); 3025 __publicField(this, "skipMountOnRender", true); 3026 } 3027 mount() { 3028 } 3029 renderAndMount() { 3030 const checkBox = this.getComponent("Checkbox/V1"); 3031 checkBox.setChecked(this.isChecked); 3032 const arrow = this.element.querySelector(".elProductBumpHeadlineArrow"); 3033 const modernButtonText = this.element.querySelector(".elProductCardModernButton > span"); 3034 if (this.isChecked) { 3035 this.element.classList.add("elProductSelected"); 3036 if (arrow) arrow.classList.add("elHide"); 3037 if (modernButtonText) modernButtonText.innerText = this.checkoutProductCardBumpTexts.unselect; 3038 } else { 3039 this.element.classList.remove("elProductSelected"); 3040 if (arrow) arrow.classList.remove("elHide"); 3041 if (modernButtonText) modernButtonText.innerText = this.checkoutProductCardBumpTexts.add; 3042 } 3043 if (this.selectType === "quantity") { 3044 const quantityInput = this.element.querySelector(".elProductCardShortInput"); 3045 if (quantityInput) quantityInput.value = this.quantity; 3046 } 3047 this.render(); 3048 } 3049 remove() { 3050 this.element.innerHTML = ""; 3051 } 3052 render(initializeChildrenInstances = false) { 3053 const is_server = true; 3054 const selectType = this.selectType ?? null; 3055 const isChecked = this.isChecked ?? false; 3056 const showImage = this.showImage ?? null; 3057 const layout = this.layout ?? null; 3058 const product = this.product ?? null; 3059 const variant = this.variant ?? null; 3060 const selected_price = this.selected_price ?? null; 3061 const quantity = this.quantity ?? 0; 3062 const arrow = this.arrow ?? null; 3063 const checkoutProductCardBumpTexts = this.checkoutProductCardBumpTexts ?? null; 3064 const showDescription = this.element.getAttribute("data-param-showDescription"); 3065 const showCompareAtPrice = this.element.getAttribute("data-param-showCompareAtPrice"); 3066 let html = ""; 3067 { 3068 html += `<div class="elProductLayoutBorder"></div><div class="elProductLayoutBackground"></div>`; 3069 const customVariants = product?.variants.filter((value) => value["default_variant"] == false); 3070 const product_name = "product_bump"; 3071 if (layout == "classic") { 3072 html += `<div class="elProductCardImage" ygg-render="1">`; 3073 const imageUrl = variant?.image ?? product.image; 3074 if (showImage && imageUrl && imageUrl != "") { 3075 html += `<div data-page-element="Image/V2" class="elImageWrapper de-image-block id-Image/V2`; 3076 if (CF2Blank(imageUrl) && CF2Blank(null) && true) { 3077 html += ` forceHide`; 3078 } 3079 html += `" data-liquid-replace="item">`; 3080 if (imageUrl || !CF2Blank(null)) { 3081 html += `<img class="elImage" src="${imageUrl ?? null}" data-lazy-loading="true" data-lazy-loading="true"/>`; 3082 } else if (false) { 3083 html += `<div class="image-placeholder" title=""><span class="image-placeholder-header"></span></div>`; 3084 } 3085 html += `</div>`; 3086 } 3087 html += `</div>`; 3088 html += `<div class="elProductCardInfoContainer"><div class="elProductCardInputAndTitle">`; 3089 const isClassic = layout == "classic"; 3090 if (arrow?.icon != "none" && isChecked != true) { 3091 if (arrow?.animation) { 3092 html += `<span data-animation-type="${arrow?.animation}" data-animation-delay="600" data-animation-loop="true" class="elProductBumpHeadlineArrow"><i class="${arrow?.icon}"></i></span>`; 3093 } else { 3094 html += `<span class="elProductBumpHeadlineArrow"><i class="${arrow?.icon}"></i></span>`; 3095 } 3096 } 3097 html += `<div class="elProductCardSelectInput`; 3098 if (isClassic == false || selectType == "quantity") { 3099 html += ` elHide`; 3100 } 3101 html += `">`; 3102 if (isChecked) { 3103 html += `<div data-page-element="Checkbox/V1" type="custom_type" class="elCheckboxWrapper elFormItemWrapper de-input-block id-Checkbox/V1" data-content="" data-liquid-replace="item" data-prevent-click-on-label="false" data-trigger-click-on-wrapper="false" data-checked="true"><label class="elCheckboxLabel"><input type="checkbox" value="${product?.id}
3103" name="product" checked data-prevent-garlic="false" class="elCheckboxInput inputHolder"/><div class="elCheckbox"><div class="elCheckboxIcon"><div class="elCheckboxIconSquare hide"></div><i class="elCheckboxIconCheck fas fa-check"></i></div></div><span class="elCheckboxText"></span></label><div data-input-status-type="true" data-error-container="true"></div></div>`; 3104 } else { 3105 html += `<div data-page-element="Checkbox/V1" type="custom_type" class="elCheckboxWrapper elFormItemWrapper de-input-block id-Checkbox/V1" data-content="" data-liquid-replace="item" data-prevent-click-on-label="false" data-trigger-click-on-wrapper="false" data-checked=""><label class="elCheckboxLabel"><input type="checkbox" value="${product?.id}" name="product" data-prevent-garlic="false" class="elCheckboxInput inputHolder"/><div class="elCheckbox"><div class="elCheckboxIcon"><div class="elCheckboxIconSquare hide"></div><i class="elCheckboxIconCheck fas fa-check"></i></div></div><span class="elCheckboxText"></span></label><div data-input-status-type="true" data-error-container="true"></div></div>`; 3106 } 3107 html += `</div>`; 3108 const base_date = "1760652000"; 3109 if (product?.headline) { 3110 html += `${product?.headline}`; 3111 } else if (customVariants?.length > 1) { 3112 if (product?.bump_preheadline && product?.updated_at_timestamp && product?.updated_at_timestamp > "1760652000") { 3113 html += `${product?.bump_preheadline}<br/>`; 3114 } 3115 html += `${product?.default_variant?.name ?? "One time offer:"}`; 3116 } else { 3117 if (product?.bump_preheadline && product?.updated_at_timestamp && product?.updated_at_timestamp > "1760652000") { 3118 html += `${product?.bump_preheadline}<br/>`; 3119 } 3120 html += `${variant?.name ?? "One time offer:"}`; 3121 } 3122 html += `</div><div class="elProductCardPriceContainer" ygg-render="2">`; 3123 if (variant?.prices?.length > 1) { 3124 html += `<div class="elSelectWrapper"><select name="variant_price">`; 3125 const c0 = variant.prices; 3126 const fl1 = new CF2ForloopDrop(c0.length); 3127 for (const price of c0) { 3128 const forloop = fl1; 3129 html += `<option `; 3130 if (selected_price?.id == price?.id) { 3131 html += `selected`; 3132 } 3133 html += ` value="${price?.id}">${price?.name}</option>`; 3134 forloop.next(); 3135 } 3136 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 3137 } 3138 if (variant?.prices?.length == 1) { 3139 html += `<div class="elProductCardInfoPrice">`; 3140 if (showCompareAtPrice) { 3141 const compare_at_amount = selected_price?.compare_at_amount; 3142 if (compare_at_amount) { 3143 html += `<span class="elProductCardAnchorPrice">${compare_at_amount}</span>`; 3144 } 3145 } 3146 html += `<span class="elProductCardFinalPrice">
3146${selected_price?.name}</span></div>`; 3147 } 3148 html += `</div>`; 3149 const desc = (product?.description_override ?? variant.description ?? product.default_variant.description ?? "").replaceAll(` 3150`, "<br>"); 3151 if (desc != "") { 3152 html += `<div class="elProductCardDescription"><span class="elProductBumpText">${desc}</span></div>`; 3153 } 3154 if (customVariants?.length > 1) { 3155 html += `<div class="elProductSelectSelectorsWrapper">`; 3156 if (customVariants?.length > 1) { 3157 html += `<div class="elSelectWrapper"><select class="elBumpVariantSelector">`; 3158 const c2 = product.variants; 3159 const fl3 = new CF2ForloopDrop(c2.length); 3160 for (const product_variant of c2) { 3161 const forloop = fl3; 3162 const variant_index = forloop?.index0; 3163 let combined_variant_name = ""; 3164 const c4 = product.sorted_property_values; 3165 const fl5 = new CF2ForloopDrop(c4.length); 3166 for (const property_values of c4) { 3167 const forloop2 = fl5; 3168 const index0 = forloop2?.index0; 3169 const property_id = property_values?.property_id; 3170 const property_value_id = product_variant?.property_value_ids?.[index0]; 3171 if (combined_variant_name != "") { 3172 combined_variant_name = combined_variant_name.toString().concat(", "); 3173 } 3174 combined_variant_name = combined_variant_name.toString().concat(product.all_properties[property_id]); 3175 combined_variant_name = combined_variant_name.toString().concat(": "); 3176 combined_variant_name = combined_variant_name.toString().concat(product.all_properties_values[property_value_id]); 3177 forloop2.next(); 3178 } 3179 html += `<option value="${product_variant?.property_value_ids}" `; 3180 if (product_variant?.id == variant?.id) { 3181 html += `selected`; 3182 } 3183 html += `>${combined_variant_name}</option>`; 3184 forloop.next(); 3185 } 3186 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 3187 } 3188 html += `</div>`; 3189 } 3190 if (selectType == "quantity") { 3191 html += `<div class="elProductInputWrapper elProductCardQuantityContainer"><span>${checkoutProductCardBumpTexts?.quantity}</span><div class="elProductInputControls"><button class="elProductCardInput">-</button><input class="elProductCardInput elProductCardShortInput" name="product" value="${quantity ?? 0}" min="0" type="number"/><button class="elProductCardInput">+</button></div></div>`; 3192 } else if (selectType == "quantity-forced") { 3193 html += `<div class="elProductInputWrapper elSelectWrapper elForcedQuantityWrapper"><span>${checkoutProductCardBumpTexts?.quantity}</span><select name="product" class="elProductCardInput elProductInputControls">`; 3194 const step = product?.step ?? 2; 3195 const min = product?.min ?? 0; 3196 const max = product?.max ?? 5; 3197 const item_count_step_1 = max - min; 3198 const item_count_step_2 = item_count_step_1 / step; 3199 const item_count_step_3 = item_count_step_2 | 0; 3200 const range = Array.apply(0, Array(item_count_step_3)).map((element, index) => index + 0); 3201 ; 3202 const c6 = range; 3203 const fl7 = new CF2ForloopDrop(c6.length); 3204 for (const i of c6) { 3205 const forloop = fl7; 3206 const value = i * step + min; 3207 html += `<option value="${value}">${value}</option>`; 3208 forloop.next(); 3209 } 3210 html += `</select><div class="elSelectArrow elForcedQuantitySelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 3211 } 3212 html += `</div>`; 3213 } else { 3214 html += `<div class="elProductCardImage" ygg-render="1">`; 3215 const imageUrl = variant?.image ?? product.image; 3216 if (showImage && imageUrl && imageUrl != "") { 3217 html += `<div data-page-element="Image/V2" class="elImageWrapper de-image-block id-Image/V2`; 3218 if (CF2Blank(imageUrl) && CF2Blank(null) && true) { 3219 html += ` forceHide`; 3220 } 3221 html += `" data-liquid-replace="item">`; 3222 if (imageUrl || !CF2Blank(null)) { 3223 html += `<img class="elImage" src="${imageUrl ?? null}" data-lazy-loading="true" data-lazy-loading="true"/>`; 3224 } else if (false) { 3225 html += `<div class="image-placeholder" title=""><span class="image-placeholder-header"></span></div>`; 3226 } 3227 html += `</div>`; 3228 } 3229 html += `</div>`; 3230 html += `<div class="elProductCardInfoContainer"><div class="elProductCardInputAndTitle">`; 3231 const isClassic = layout == "classic"; 3232 if (arrow?.icon != "none" && isChecked != true) { 3233 if (arrow?.animation) { 3234 html += `<span data-animation-type="${arrow?.animation}" data-animation-delay="600" data-animation-loop="true" class="elProductBumpHeadlineArrow"><i class="${arrow?.icon}"></i></span>`;
3235 } else { 3236 html += `<span class="elProductBumpHeadlineArrow"><i class="${arrow?.icon}"></i></span>`; 3237 } 3238 } 3239 html += `<div class="elProductCardSelectInput`; 3240 if (isClassic == false || selectType == "quantity") { 3241 html += ` elHide`; 3242 } 3243 html += `">`; 3244 if (isChecked) { 3245 html += `<div data-page-element="Checkbox/V1" type="custom_type" class="elCheckboxWrapper elFormItemWrapper de-input-block id-Checkbox/V1" data-content="" data-liquid-replace="item" data-prevent-click-on-label="false" data-trigger-click-on-wrapper="false" data-checked="true"><label class="elCheckboxLabel"><input type="checkbox" value="${product?.id}" name="product" checked data-prevent-garlic="false" class="elCheckboxInput inputHolder"/><div class="elCheckbox"><div class="elCheckboxIcon"><div class="elCheckboxIconSquare hide"></div><i class="elCheckboxIconCheck fas fa-check"></i></div></div><span class="elCheckboxText"></span></label><div data-input-status-type="true" data-error-container="true"></div></div>`; 3246 } else { 3247 html += `<div data-page-element="Checkbox/V1" type="custom_type" class="elCheckboxWrapper elFormItemWrapper de-input-block id-Checkbox/V1" data-content="" data-liquid-replace="item" data-prevent-click-on-label="false" data-trigger-click-on-wrapper="false" data-checked=""><label class="elCheckboxLabel"><input type="checkbox" value="${product?.id}" name="product" data-prevent-garlic="false" class="elCheckboxInput inputHolder"/><div class="elCheckbox"><div class="elCheckboxIcon"><div class="elCheckboxIconSquare hide"></div><i class="elCheckboxIconCheck fas fa-check"></i></div></div><span class="elCheckboxText"></span></label><div data-input-status-type="true" data-error-container="true"></div></div>`; 3248 } 3249 html += `</div>`; 3250 const base_date = "1760652000"; 3251 if (product?.headline) { 3252 html += `${product?.headline}`; 3253 } else if (customVariants?.length > 1) { 3254 if (product?.bump_preheadline && product?.updated_at_timestamp && product?.updated_at_timestamp > "1760652000") { 3255 html += `${product?.bump_preheadline}<br/>`; 3256 } 3257 html += `${product?.default_variant?.name ?? "One time offer:"}`; 3258 } else { 3259 if (product?.bump_preheadline && product?.updated_at_timestamp && product?.updated_at_timestamp > "1760652000") { 3260 html += `${product?.bump_preheadline}<br/>`; 3261 } 3262 html += `${variant?.name ?? "One time offer:"}`; 3263 } 3264 html += `</div><div class="elProductCardPriceContainer" ygg-render="2">`; 3265 if (variant?.prices?.length > 1) { 3266 html += `<div class="elSelectWrapper"><select name="variant_price">`; 3267 const c8 = variant.prices; 3268 const fl9 = new CF2ForloopDrop(c8.length); 3269 for (const price of c8) { 3270 const forloop = fl9; 3271 html += `<option `; 3272 if (selected_price?.id == price?.id) { 3273 html += `selected`; 3274 } 3275 html += ` value="${price?.id}">${price?.name}</option>`; 3276 forloop.next(); 3277 } 3278 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 3279 } 3280 if (variant?.prices?.length == 1) { 3281 html += `<div class="elProductCardInfoPrice">`; 3282 if (showCompareAtPrice) { 3283 const compare_at_amount = selected_price?.compare_at_amount; 3284 if (compare_at_amount) { 3285 html += `<span class="elProductCardAnchorPrice">${compare_at_amount}</span>`; 3286 } 3287 } 3288 html += `<span class="elProductCardFinalPrice">
3288${selected_price?.name}</span></div>`; 3289 } 3290 html += `</div>`; 3291 const desc = (product?.description_override ?? variant.description ?? product.default_variant.description ?? "").replaceAll(` 3292`, "<br>"); 3293 if (desc != "") { 3294 html += `<div class="elProductCardDescription"><span class="elProductBumpText">${desc}</span></div>`; 3295 } 3296 if (customVariants?.length > 1) { 3297 html += `<div class="elProductSelectSelectorsWrapper">`; 3298 if (customVariants?.length > 1) { 3299 html += `<div class="elSelectWrapper"><select class="elBumpVariantSelector">`; 3300 const c10 = product.variants; 3301 const fl11 = new CF2ForloopDrop(c10.length); 3302 for (const product_variant of c10) { 3303 const forloop = fl11; 3304 const variant_index = forloop?.index0; 3305 let combined_variant_name = ""; 3306 const c12 = product.sorted_property_values; 3307 const fl13 = new CF2ForloopDrop(c12.length); 3308 for (const property_values of c12) { 3309 const forloop2 = fl13; 3310 const index0 = forloop2?.index0; 3311 const property_id = property_values?.property_id; 3312 const property_value_id = product_variant?.property_value_ids?.[index0]; 3313 if (combined_variant_name != "") { 3314 combined_variant_name = combined_variant_name.toString().concat(", "); 3315 } 3316 combined_variant_name = combined_variant_name.toString().concat(product.all_properties[property_id]); 3317 combined_variant_name = combined_variant_name.toString().concat(": "); 3318 combined_variant_name = combined_variant_name.toString().concat(product.all_properties_values[property_value_id]); 3319 forloop2.next(); 3320 } 3321 html += `<option value="${product_variant?.property_value_ids}" `; 3322 if (product_variant?.id == variant?.id) { 3323 html += `selected`; 3324 } 3325 html += `>${combined_variant_name}</option>`; 3326 forloop.next(); 3327 } 3328 html += `</select><div class="elSelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 3329 } 3330 html += `</div>`; 3331 } 3332 if (selectType == "quantity") { 3333 html += `<div class="elProductInputWrapper elProductCardQuantityContainer"><span>${checkoutProductCardBumpTexts?.quantity}</span><div class="elProductInputControls"><button class="elProductCardInput">-</button><input class="elProductCardInput elProductCardShortInput" name="product" value="${quantity ?? 0}" min="0" type="number"/><button class="elProductCardInput">+</button></div></div>`; 3334 } else if (selectType == "quantity-forced") { 3335 html += `<div class="elProductInputWrapper elSelectWrapper elForcedQuantityWrapper"><span>${checkoutProductCardBumpTexts?.quantity}</span><select name="product" class="elProductCardInput elProductInputControls">`; 3336 const step = product?.step ?? 2; 3337 const min = product?.min ?? 0; 3338 const max = product?.max ?? 5; 3339 const item_count_step_1 = max - min; 3340 const item_count_step_2 = item_count_step_1 / step; 3341 const item_count_step_3 = item_count_step_2 | 0; 3342 const range = Array.apply(0, Array(item_count_step_3)).map((element, index) => index + 0); 3343 ; 3344 const c14 = range; 3345 const fl15 = new CF2ForloopDrop(c14.length); 3346 for (const i of c14) { 3347 const forloop = fl15; 3348 const value = i * step + min; 3349 html += `<option value="${value}">${value}</option>`; 3350 forloop.next(); 3351 } 3352 html += `</select><div class="elSelectArrow elForcedQuantitySelectArrow"><i class="fas fa-chevron-down"></i></div></div>`; 3353 } 3354 html += `</div>`; 3355 if (selectType != "quantity") { 3356 html += `<div class="elProductCardModernButton">`; 3357 if (isChecked) { 3358 html += `<span>${checkoutProductCardBumpTexts?.unselect}</span>`;
3359 } else { 3360 html += `<span>${checkoutProductCardBumpTexts?.add}</span>`; 3361 } 3362 html += `</div>`; 3363 } 3364 } 3365 } 3366 this.replaceContent(html); 3367 if (initializeChildrenInstances) { 3368 const scopeToYggRender = this.element.querySelectorAll("[ygg-render]").length > 0; 3369 const options = { scopeToYggRender }; 3370 CF2Component.hydrateTree(this.element, options); 3371 } 3372 } 3373}; 3374registerComponent("CheckoutProductCardBump/V2", CheckoutProductCardBumpV2); 3375window["CheckoutProductCardBumpV2"] = CheckoutProductCardBumpV2; 3376
3377// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-product-select-bump-v2.ts 3378init_define_process(); 3379init_runtime(); 3380var CheckoutProductSelectBumpV2 = class extends CF2Component { 3381 constructor(el, runtimeSel) { 3382 super(el, runtimeSel); 3383 } 3384 mount() { 3385 const productCardComponents = this.getComponents("CheckoutProductCardBump/V2"); 3386 registerOneTimeCardElementListeners(productCardComponents); 3387 productCardComponents.forEach((pcc) => { 3388 registerEventListeners(pcc); 3389 this.registerBumpVariantEventListeners(pcc); 3390 }); 3391 } 3392 registerBumpVariantEventListeners(pcc) { 3393 const element = pcc.element; 3394 const variantSelects = element.querySelectorAll(".elBumpVariantSelector"); 3395 variantSelects.forEach((select, index) => { 3396 select.addEventListener("click", (evt) => { 3397 evt.stopImmediatePropagation(); 3398 evt.stopPropagation(); 3399 evt.preventDefault(); 3400 }); 3401 select.addEventListener("change", (evt) => { 3402 evt.stopImmediatePropagation(); 3403 evt.stopPropagation(); 3404 evt.preventDefault(); 3405 const newValues = [...variantSelects].map((e) => e.value); 3406 const selectedVariantId = pcc.product.property_values_variant_mapping[newValues]; 3407 const oldCartItem = { product_id: pcc.product.id, variant_id: pcc.variant.id, price_id: pcc.selected_price.id }; 3408 const newVariant = pcc.product.variants.find((v) => v.id == String(selectedVariantId)); 3409 const newPrice = newVariant.prices[0]; 3410 const newCartItem = { product_id: pcc.product.id, variant_id: newVariant.id, price_id: newPrice.id }; 3411 updateCardByProductIdState(pcc.product.id, { variantId: newVariant.id, priceId: newPrice.id }); 3412 pcc.renderAndMount(); 3413 registerPriceEventListeners(pcc); 3414 }); 3415 }); 3416 } 3417}; 3418registerComponent("CheckoutProductSelectBump/V2", CheckoutProductSelectBumpV2); 3419window["CheckoutProductSelectBumpV2"] = CheckoutProductSelectBumpV2; 3420
3421// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-shipping-profile-select-v1.ts 3422init_define_process(); 3423init_radio_v1(); 3424init_cf_utils(); 3425init_cfLodash(); 3426init_runtime(); 3427var CheckoutShippingProfileSelectV1 = class extends CF2Component { 3428 constructor(el, runtimeSel) { 3429 super(el, runtimeSel); 3430 __publicField(this, "loadingShipping"); 3431 __publicField(this, "shippingOptions"); 3432 __publicField(this, "shippingOption"); 3433 } 3434 onSelectOption(option) { 3435 } 3436 mount() { 3437 this.element.addEventListener("click", (evt) => { 3438 const shippingProfileCards = this.element.querySelectorAll(".elShippingProfile"); 3439 for (const card of shippingProfileCards) { 3440 if (isEventInside(evt, card)) { 3441 evt.preventDefault(); 3442 const key = card.getAttribute("data-shipping-option"); 3443 if (key) { 3444 const option = this.shippingOptions.find(({ description }) => description === key); 3445 this.onSelectOption(option.value); 3446 } 3447 break; 3448 } 3449 } 3450 }); 3451 } 3452 show() { 3453 this.element.classList.remove("forceHide"); 3454 } 3455 hide() { 3456 this.element.classList.add("forceHide"); 3457 } 3458 setOption(option) { 3459 this.shippingOption = option; 3460 const radio = this.shippingOption && this.element.querySelector(`[data-shipping-option="${this.shippingOption.description}"] .elRadioInput`); 3461 if (radio) { 3462 radio.checked = true; 3463 } 3464 } 3465 isEqualState(newState) { 3466 const updatableKeys = ["hasValidShippingAddress", "loadingShipping", "summaryHasError", "shippingOption", "shippingOptions"]; 3467 const currentState = updatableKeys.reduce((acc, key) => { 3468 acc[key] = this[key]; 3469 return acc; 3470 }, {}); 3471 return isEqual(newState, currentState); 3472 } 3473 updateState(data) { 3474 const newState = { 3475 hasValidShippingAddress: false, 3476 loadingShipping: false, 3477 summaryHasError: false, 3478 shippingOption: null, 3479 shippingOptions: [], 3480 ...data 3481 }; 3482 if (this.isEqualState(newState)) return false; 3483 Object.assign(this, newState); 3484 this.render(); 3485 return true; 3486 } 3487 setLoading() { 3488 this.updateState({ 3489 loadingShipping: true, 3490 hasValidShippingAddress: true 3491 }); 3492 } 3493 setInvalidAddress() { 3494 this.updateState({ 3495 hasValidShippingAddress: false 3496 }); 3497 } 3498 setSummaryError() { 3499 this.updateState({ 3500 summaryHasError: true 3501 }); 3502 } 3503 setShippingOptions(shippingOptions, shippingOption) { 3504 const result = this.updateState({ 3505 shippingOption, 3506 shippingOptions: this.formatShippingOptions(shippingOptions), 3507 hasValidShippingAddress: true 3508 }); 3509 if (result) this.setOption(this.shippingOption); 3510 } 3511 formatShippingOptions(shippingOptions) { 3512 return shippingOptions.map((option) => { 3513 const { description, amount: { amount, currency }, amount_formatted } = option; 3514 return { 3515 key: JSON.stringify(option), 3516 value: option, 3517 description, 3518 priceLabel: amount_formatted 3519 }; 3520 }); 3521 } 3522 update({ shippingOptions, ...state }) { 3523 Object.assign(this, state); 3524 if (shippingOptions) { 3525 this.shippingOptions = shippingOptions?.map((option) => { 3526 const { description, amount: { amount, currency }, amount_formatted } = option; 3527 return { 3528 key: JSON.stringify(option), 3529 value: option, 3530 description, 3531 priceLabel: amount_formatted 3532 }; 3533 }); 3534 } 3535 this.render(); 3536 this.setOption(this.shippingOption); 3537 } 3538 remove() { 3539 this.element.innerHTML = ""; 3540 } 3541 render(initializeChildrenInstances = false) { 3542 const is_server = true; 3543 const title = this.title ?? null; 3544 const titleEnabled = this.titleEnabled ?? null; 3545 const otherTexts = this.otherTexts ?? null; 3546 const shippingOptions = this.shippingOptions ?? []; 3547 const shippingOption = this.shippingOption ?? void 0; 3548 const hasValidShippingAddress = this.hasValidShippingAddress ?? false; 3549 const loadingShipping = this.loadingShipping ?? false; 3550 const summaryHasError = this.summaryHasError ?? false; 3551 let html = ""; 3552 { 3553 if (titleEnabled) { 3554 html += `<div class="elCheckoutFormLabelContainer"><div class="elCheckoutFormLabel">${title}</div> <hr class="elCheckoutFormLabelDivider"/></div>`; 3555 } 3556 html += `<div class="elShippingProfileList" ygg-render="replace">`; 3557 if (summaryHasError) { 3558 html += `<div class="elShippingProfileCardWrapper elShippingProfilesEmpty"> <div class="elShippingProfile elShippingProfileLayout">
3558<div class="elShippingProfileLayoutBackground"></div><div><p></p></div></div></div>`; 3559 } else if (hasValidShippingAddress || false) { 3560 if (loadingShipping) { 3561 html += `<div class="elShippingProfileCardWrapper elShippingProfilesEmpty"> <div class="elShippingProfile elShippingProfileLayout"><div class="elShippingProfileLayoutBackground"></div><div><div><i class="fa fa-spinner fa-spin"></i></div></div></div></div>`; 3562 } else if (shippingOptions && shippingOptions?.length > 0) { 3563 const c0 = shippingOptions; 3564 const fl1 = new CF2ForloopDrop(c0.length); 3565 for (const shippingProfile of c0) { 3566 const forloop = fl1; 3567 const currentIndex = forloop?.index0; 3568 const isDefaultValue = currentIndex == 0; 3569 const hasValue = shippingOption; 3570 const isSelected = shippingOption == shippingProfile?.key; 3571 html += ` `; 3572 const isChecked = hasValue && isSelected || isDefaultValue; 3573 html += ` `; 3574 html += `<div class="elShippingProfileCardWrapper"><div class="elShippingProfile elShippingProfileLayout`; 3575 if (isChecked) { 3576 html += ` elShippingProfileSelected`; 3577 } 3578 html += ` elShippingProfileClickable" data-shipping-option="${shippingProfile?.description}"><div class="elShippingProfileLayoutBackground"></div><div class="elShippingProfileSelectInput">`; 3579 if (isChecked) { 3580 html += `<div data-page-element="Radio/V1" class="elRadioWrapper id-Radio/V1" data-liquid-replace="item" data-checked="true" data-trigger-click-on-wrapper="false"><label class="elRadioLabel"><input type="radio" value="" name="shipping_profile" checked class="elRadioInput"/><div class="elRadio"><div class="elRadioIcon"></div></div><span class="elRadioText"></span></label></div>`; 3581 } else { 3582 html += `<div data-page-element="Radio/V1" class="elRadioWrapper id-Radio/V1" data-liquid-replace="item" data-checked="" data-trigger-click-on-wrapper="false"><label class="elRadioLabel"><input type="radio" value="" name="shipping_profile" class="elRadioInput"/><div class="elRadio"><div class="elRadioIcon"></div></div><span class="elRadioText"></span></label></div>`; 3583 } 3584 html += `</div> <div class="elShippingProfileCardNameContainer"><div class="elShippingProfileCardInfoName">${shippingProfile?.description}</div></div> <div class="elShippingProfileCardPriceContainer"><span class="elShippingProfileInfoPrice elShippingProfileFinalPrice">${shippingProfile?.priceLabel}</span></div></div></div>`; 3585 forloop.next(); 3586 } 3587 } else if (shippingOptions && shippingOptions?.length == 0) { 3588 html += `<div class="elShippingProfileCardWrapper elShippingProfilesEmpty"> <div class="elShippingProfile elShippingProfileLayout"><div class="elShippingProfileLayoutBackground"></div><div><div><i class="fa fa-truck"></i></div><p></p></div></div></div>`; 3589 } 3590 } else { 3591 html += `<div class="elShippingProfileCardWrapper elShippingProfilesEmpty"> <div class="elShippingProfile elShippingProfileLayout"><div class="elShippingProfileLayoutBackground"></div><div><div><i class="fa fa-truck"></i></div><p>${otherTexts?.shippingOptionsPlaceholder}</p></div></div></div>`; 3592 } 3593 html += `</div>`; 3594 } 3595 this.replaceContent(html); 3596 if (initializeChildrenInstances) { 3597 const scopeToYggRender = this.element.querySelectorAll("[ygg-render]").length > 0; 3598 const options = { scopeToYggRender }; 3599 CF2Component.hydrateTree(this.element, options); 3600 } 3601 } 3602}; 3603registerComponent("CheckoutShippingProfileSelect/V1", CheckoutShippingProfileSelectV1); 3604window["CheckoutShippingProfileSelectV1"] = CheckoutShippingProfileSelectV1; 3605
3606// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-loading-v1.ts 3607init_define_process(); 3608init_runtime(); 3609var CheckoutLoadingV1 = class extends CF2Component { 3610 constructor(el, runtimeSel) { 3611 super(el, runtimeSel); 3612 } 3613 mount() { 3614 } 3615 show() { 3616 this.element.classList.remove("elHide"); 3617 } 3618 showWaitingOnQueueText(text) { 3619 this.element.querySelector(".elCheckoutLoadingWaitingOnQueue").classList.remove("elHide"); 3620 this.element.querySelector(".elCheckoutLoadingWaitingOnQueue").innerHTML = text; 3621 } 3622 hideWaitingOnQueueText() { 3623 this.element.querySelector(".elCheckoutLoadingWaitingOnQueue").classList.add("elHide"); 3624 } 3625 hide() { 3626 this.element.classList.add("elHide"); 3627 } 3628}; 3629registerComponent("CheckoutLoading/V1", CheckoutLoadingV1); 3630window["CheckoutLoadingV1"] = CheckoutLoadingV1; 3631
3632// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-submit-notification-v1.ts 3633init_define_process(); 3634init_runtime(); 3635var CheckoutSubmitNotificationV1 = class extends CF2Component { 3636 constructor(el, runtimeSel) { 3637 super(el, runtimeSel); 3638 } 3639 mount() { 3640 } 3641 setStatus(text, subtext, extratext = "") { 3642 if (text) { 3643 this.element.querySelector(".mainText").classList.remove("elHide"); 3644 this.element.querySelector(".mainText").innerHTML = text; 3645 } else { 3646 this.element.querySelector(".mainText").classList.add("elHide"); 3647 } 3648 if (subtext) { 3649 this.element.querySelector(".subText").classList.remove("elHide"); 3650 this.element.querySelector(".subText").innerHTML = subtext; 3651 } else { 3652 this.element.querySelector(".subText").classList.add("elHide"); 3653 } 3654 if (extratext) { 3655 this.element.querySelector(".extraText").classList.remove("elHide"); 3656 this.element.querySelector(".extraText").innerHTML = extratext; 3657 } else { 3658 this.element.querySelector(".extraText").classList.add("elHide"); 3659 } 3660 } 3661}; 3662registerComponent("CheckoutSubmitNotification/V1", CheckoutSubmitNotificationV1); 3663window["CheckoutSubmitNotificationV1"] = CheckoutSubmitNotificationV1; 3664
3665// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-apple-pay-button-v1.ts 3666init_define_process(); 3667
3668// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-submit.ts 3669init_define_process(); 3670
3671// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Utils/checkout-path.ts 3672init_define_process(); 3673var renderedPath = () => { 3674 const renderedPage = document.querySelector('meta[name="rendered-page-url"]')?.getAttribute("content"); 3675 return renderedPage ?? window.location.pathname; 3676}; 3677var renderedHref = (extraPath) => { 3678 const url = new URL(window.location.href); 3679 url.pathname = renderedPath() + (extraPath ?? ""); 3680 return url.toString(); 3681}; 3682
3683// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Utils/checkout-address.ts 3684init_define_process(); 3685init_general(); 3686var STATES_WITH_POSTAL_CODE = /* @__PURE__ */ new Set(["US", "GB", "CA", "FI", "FR", "IT", "ES"]); 3687var backfillAddressId = (address) => { 3688 if (address.id) return address; 3689 let addressId = "no-id#"; 3690 addressId += [address.country, address.state, address.city, address.zip, address.address, address.address_2].filter(Boolean).join(":"); 3691 return { ...address, id: addressId }; 3692}; 3693var backfillAddressesId = (addresses) => { 3694 return addresses.map((address) => backfillAddressId(address)); 3695}; 3696var isSavedAddress = (address) => { 3697 return address.id && !String(address.id).includes("no-id#"); 3698}; 3699var fieldsForCountry = (fields, country) => { 3700 const fieldsLength = Object.keys(fields).length; 3701 if (fieldsLength > 0 && fieldsLength <= 2) { 3702 const hasPostalCode = STATES_WITH_POSTAL_CODE.has(country); 3703 if (hasPostalCode) { 3704 return ["country", "zip"]; 3705 } else { 3706 return ["country"]; 3707 } 3708 } 3709 return fields; 3710}; 3711var addressToString = (address) => { 3712 let str = ""; 3713 if (address.address) { 3714 str = address.address; 3715 if (address.address2) { 3716 str += `, ${address.address2}`; 3717 } 3718 if (address.city) { 3719 str += `. ${address.city}`; 3720 } 3721 if (address.state) { 3722 str += `, ${address.state}`; 3723 } 3724 if (address.zip) { 3725 str += ` ${address.zip}`; 3726 } 3727 if (address.country) { 3728 str += `, ${address.country}`; 3729 } 3730 } else { 3731 if (address.zip) { 3732 str += `${address.zip}, `; 3733 } 3734 if (address.country) { 3735 str += `${address.country}`; 3736 } 3737 } 3738 return str; 3739}; 3740var parseAddressByFields = (address, fields, shouldBackfill = true) => { 3741 const addressByFields = fields.reduce((acc, field) => { 3742 acc[field] = address[field] ?? (shouldBackfill ? globalThis.Checkout.contactLocale[field] : null); 3743 return acc; 3744 }, {}); 3745 return cleanEmptyObjectKeys({ ...addressByFields, id: address.id }); 3746}; 3747
3748// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-submit.ts 3749init_general(); 3750init_nonce(); 3751init_cf_utils(); 3752
3753// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-store.ts 3754init_define_process(); 3755
3756// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-critical-errors.ts 3757init_define_process(); 3758init_error_with_cause(); 3759init_fetcher(); 3760var CheckoutCriticalError = class extends CFErrorWithCause { 3761 constructor(message, options) { 3762 super(message, options); 3763 __publicField(this, "name"); 3764 __publicField(this, "context"); 3765 this.name = "CheckoutCriticalError"; 3766 } 3767}; 3768var ERROR_CODES = { 3769 EMPTY_PRODUCTS_ERROR: "EMPTY_PRODUCTS_ERROR", 3770 EMPTY_PAYMENT_METHODS_ERROR: "EMPTY_PAYMENT_METHODS_ERROR", 3771 UNEXPECTED_INITIALIZATION_ERROR: "UNEXPECTED_INITIALIZATION_ERROR", 3772 FETCH_FEATURE_FLAGS_ERROR: "FETCH_FEATURE_FLAGS_ERROR", 3773 FETCH_COUNTRIES_STATES_ERROR: "FETCH_COUNTRIES_STATES_ERROR", 3774 FETCH_STRIPE_ADDRESS_FIELD_COUNTRIES_ERROR: "FETCH_STRIPE_ADDRESS_FIELD_COUNTRIES_ERROR", 3775 PAI_INITIALIZATION_SCRIPT_ERROR: "PAI_INITIALIZATION_SCRIPT_ERROR", 3776 PAI_INITIALIZATION_TIMEOUT_ERROR: "PAI_INITIALIZATION_TIMEOUT_ERROR", 3777 PAI_INITIALIZATION_READY_TIMEOUT_ERROR: "PAI_INITIALIZATION_READY_TIMEOUT_ERROR", 3778 PAI_INITIALIZATION_CONFIG_ERROR: "PAI_INITIALIZATION_CONFIG_ERROR", 3779 READY_TO_PAY_UPDATE_ERROR: "READY_TO_PAY_UPDATE_ERROR", 3780 FETCH_EXISTING_ORDERS_ERROR: "FETCH_EXISTING_ORDERS_ERROR", 3781 FETCH_PHONE_UTILS_ERROR: "FETCH_PHONE_UTILS_ERROR", 3782 ORDER_RECURRING_INTERVAL_MISMATCH: "ORDER_RECURRING_INTERVAL_MISMATCH", 3783 ERROR_PROCESSING_STRIPE_PAYMENT: "ERROR_PROCESSING_STRIPE_PAYMENT", 3784 ERROR_STRIPE_3DS_DECLINED: "ERROR_STRIPE_3DS_DECLINED", 3785 ERROR_STRIPE_CARD_DECLINED: "ERROR_STRIPE_CARD_DECLINED", 3786 MULTIPLE_CHECKOUT_PRESENT: "MULTIPLE_CHECKOUT_PRESENT" 3787}; 3788var displayAndLogCriticalError = (checkoutCriticalError, extraContext) => { 3789 const criticalErrors = globalThis.Checkout.store.criticalErrors.get(); 3790 const originalError = checkoutCriticalError.cause; 3791 if (originalError instanceof CFFetcherError) { 3792 const fetchError = originalError; 3793 globalThis.Checkout.store.criticalErrors.set([ 3794 ...criticalErrors, 3795 { code: checkoutCriticalError.message, fetchErrorType: fetchError.type } 3796 ]); 3797 } else { 3798 globalThis.Checkout.store.criticalErrors.set([...criticalErrors, { code: checkoutCriticalError.message }]); 3799 } 3800 console.error(CFstackWithCauses(checkoutCriticalError)); 3801 const context = { ...checkoutCriticalError.context ?? {}, ...extraContext ?? {} }; 3802 if (Object.keys(context).length > 0) { 3803 globalThis.Honeybadger?.notify(checkoutCriticalError, { context }); 3804 } else { 3805 globalThis.Honeybadger?.notify(checkoutCriticalError); 3806 } 3807}; 3808
3809// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-store.ts 3810init_nanostores(); 3811
3812// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/RebillyCheckout/checkout-globals.ts 3813init_define_process(); 3814
3815// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-data-loader.ts 3816init_define_process(); 3817init_general(); 3818var getSSRGlobalResourceData = () => { 3819 const productSelectType = globalThis.globalResourceData.product_quantity_type ?? "single"; 3820 const { checkout_v2_state, contact } = globalThis?.sessionData ?? {}; 3821 const initialContactData = checkout_v2_state === "guest" ? {} : cleanEmptyObjectKeys({ 3822 first_name: contact?.first_name ?? "", 3823 last_name: contact?.last_name ?? "", 3824 email: contact?.email ?? "", 3825 phone_number: contact?.phone_number ?? "" 3826 }); 3827 const { products, productsById, variantsById, pricesById } = globalThis.globalResourceData; 3828 const savedPaymentMethods = contact?.payment_methods ?? []; 3829 return { 3830 productSelectType, 3831 products, 3832 productsById, 3833 variantsById, 3834 pricesById, 3835 savedPaymentMethods, 3836 initialContactData 3837 }; 3838}; 3839
3840// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-states.ts 3841init_define_process(); 3842var PaypalStates = { 3843 IDLE: "idle", 3844 INITIALIZED: "initialized", 3845 ERROR: "error", 3846 ADDING_PAYMENT_METHOD: "adding-payment-method", 3847 PAYMENT_METHOD_APPROVED: "payment-method-approved" 3848}; 3849var ErrorTypes = { 3850 REBILLY_ERROR: "rebilly-error", 3851 SERVER_ERROR: "server-error", 3852 UNHANDLED_SERVER_RESPONSE: "unhandled-server-response", 3853 THREEDS_DECLINED_ERROR: "3ds-declined-error", 3854 THREEDS_DECLINED_CUSTOM_ERROR: "3ds-declined-custom-error", 3855 PAYPAL_DECLINED_ERROR: "paypal-declined-error", 3856 PAYPAL_CUSTOM_ERROR: "paypal-custom-error" 3857}; 3858
3859// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/StripeCheckout/utils.ts 3860init_define_process(); 3861function hasRecurringPrice(cart) { 3862 return cart.items.some(({ price_id }) => { 3863 const price = globalThis.globalResourceData.pricesById[price_id]; 3864 return price.is_recurring; 3865 }); 3866} 3867function hasPhysicalProductsWithParams(cart) { 3868 return cart.items.some(({ product_id, variant_id }) => { 3869 const product = globalThis.Checkout.productsById[product_id]; 3870 const variant = globalThis.Checkout.variantsById[variant_id]; 3871 let productType = variant?.product_type; 3872 productType = productType || product?.product_type; 3873 return productType == "physical"; 3874 }); 3875} 3876function hasUpgradeDowngradeItems(cart) { 3877 return cart.items.some((item) => item.type === "upgradeDowngrade"); 3878} 3879function getStripeMode(cart, amount) { 3880 if (amount == 0) return "setup"; 3881 return hasRecurringPrice(cart) ? "subscription" : "payment"; 3882} 3883function getCartEstimatedTotal(cart) { 3884 const estimatedAmount = cart.items.reduce((acc, { price_id }) => { 3885 const price = globalThis.globalResourceData.pricesById[price_id]; 3886 return acc + price.initial_price_cents; 3887 }, 0); 3888 return estimatedAmount; 3889} 3890function convertToStripeAddress(address) { 3891 return { 3892 line1: address.address_one, 3893 line2: address.address_two, 3894 city: address.city, 3895 state: address.state, 3896 postal_code: address.postal_code, 3897 country: address.country 3898 }; 3899} 3900function convertAddressFromStripe(address) { 3901 return { 3902 address_one: address.line1, 3903 address_two: address.line2, 3904 city: address.city, 3905 state: address.state, 3906 country: address.country, 3907 postal_code: address.postal_code 3908 }; 3909} 3910function convertAddressFromSession(address) { 3911 return { 3912 address_one: address.address, 3913 address_two: address.address_2, 3914 city: address.city, 3915 state: address.state, 3916 country: address.country, 3917 postal_code: address.zip 3918 }; 3919} 3920function calculateStripeLineItems(lineItems, shippingOption, taxAmount, discountAmount) { 3921 const allLineItems = lineItems.map(({ priceCents, description }) => { 3922 return { 3923 name: description, 3924 amount: priceCents 3925 }; 3926 }); 3927 if (shippingOption) { 3928 allLineItems.push({ 3929 name: shippingOption.description, 3930 amount: shippingOption.amount_cents 3931 }); 3932 } 3933 if (taxAmount) { 3934 allLineItems.push({ 3935 name: "Taxes", 3936 amount: taxAmount 3937 }); 3938 } 3939 if (discountAmount) { 3940 allLineItems.push({ 3941 name: "Discount", 3942 amount: -discountAmount 3943 }); 3944 } 3945 return allLineItems; 3946} 3947var STRIPE_SKIP_SHIPPING_ID = "skip it"; 3948function calculateStripeChangeResolveDetails(lineItems, quotesResponse, shippingOption, taxAmount, discountAmount) { 3949 return { 3950 lineItems: calculateStripeLineItems(lineItems, shippingOption, taxAmount, discountAmount), 3951 shippingRates: quotesResponse?.map((option) => { 3952 const { description, amount_cents } = option; 3953 return { 3954 id: JSON.stringify(option), 3955 amount: amount_cents, 3956 displayName: description 3957 }; 3958 }) ?? [ 3959 { 3960 id: STRIPE_SKIP_SHIPPING_ID, 3961 amount: 0, 3962 displayName: "Free" 3963 } 3964 ] 3965 }; 3966} 3967function parseCssVars(element, obj) { 3968 Object.keys(obj ?? {}).forEach((key) => { 3969 const value = obj[key]; 3970 if (typeof value === "object") { 3971 obj[key] = parseCssVars(element, value); 3972 } else { 3973 if (typeof value === "string" && value.includes("--")) { 3974 obj[key] = getComputedStyle(element).getPropertyValue(value); 3975 } 3976 } 3977 }); 3978 return obj; 3979} 3980
3981// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/RebillyCheckout/checkout-globals.ts 3982var CheckoutStates = { 3983 OTO: "oto", 3984 GUEST: "guest", 3985 SAVED: "saved", 3986 UPGRADE_DOWNGRADE: "upgradeDowngrade", 3987 REACTIVATE: "reactivate" 3988}; 3989var StoreStates = { 3990 START: "start", 3991 INITIALIZING: "initializing", 3992 INITIALIZED: "initialized", 3993 FILLING_FORM: "filling-form", 3994 SUBMITTING: "submitting", 3995 SUBMITTED: "submitted" 3996}; 3997var SummaryStates = { 3998 WAITING: "waiting", 3999 CALCULATING: "calculating", 4000 ERROR: "error", 4001 OK: "ok" 4002}; 4003var CouponStates = { 4004 READY: "ready", 4005 APPLYING: "applying", 4006 APPLIED: "applied", 4007 ERROR: "error" 4008}; 4009var PaymentStates = { 4010 START: "start", 4011 INITIALIZING: "initializing", 4012 LOADING: "loading", 4013 INITIALIZED: "initialized" 4014}; 4015var SubmittingStates = { 4016 IDLE: "idle", 4017 START: "start", 4018 WAITING_ON_QUEUE: "waiting-on-queue", 4019 ERROR: "error", 4020 DONE: "done" 4021}; 4022var states = { 4023 StoreStates, 4024 SummaryStates, 4025 PaymentStates, 4026 SubmittingStates, 4027 PaypalStates, 4028 CouponStates, 4029 ErrorTypes, 4030 CheckoutStates 4031}; 4032var globals = getSSRGlobalResourceData(); 4033var ssrDynamicData = globalThis.getSSRDynamicStoreData(globals.products); 4034globalThis.Checkout = { 4035 ...states, 4036 ...globals, 4037 ssrDynamicData, 4038 utils: buildUtils() 4039}; 4040window.addEventListener( 4041 "keydown", 4042 function(e) { 4043 if (e.key == "Enter") { 4044 if (globalThis.Checkout.store?.payment.type.get() == "apple-pay") { 4045 e.preventDefault(); 4046 return false; 4047 } 4048 } 4049 }, 4050 true 4051); 4052var cleanupEmptyErrors = (errors) => { 4053 if (errors.globalErrors.length == 0) delete errors.globalErrors; 4054 if (Object.keys(errors.fields).length == 0) delete errors.fields; 4055 if (Object.keys(errors).length == 0) return null; 4056 return errors; 4057}; 4058function hasErrors(errors) { 4059 return (errors?.globalErrors ?? []).length != 0 || Object.keys(errors?.fields ?? {}).length != 0; 4060} 4061function productErrors(cart, showAllErrors) { 4062 const errors = { 4063 globalErrors: [], 4064 fields: {} 4065 }; 4066 if (showAllErrors) { 4067 const hasProducts = cart.items.filter((p) => !globalThis.Checkout.productsById[p.product_id].bump).some((item) => item.quantity > 0); 4068 if (!hasProducts) { 4069 errors.globalErrors.push({ message: "At least one product should be selected" }); 4070 } 4071 } 4072 return cleanupEmptyErrors(errors); 4073} 4074function shippingOptionErrors(loadingShipping, cart, shippingOptions, shippingOption, showAllErrors, paymentType) { 4075 const errors = { 4076 globalErrors: [], 4077 fields: {} 4078 }; 4079 if (!showAllErrors || loadingShipping || !hasPhysicalProductsWithParams(cart) || paymentType == "apple-pay") { 4080 return null; 4081 } 4082 const shippingOptionIsValid = shippingOption && shippingOptions?.length > 0; 4083 if (!shippingOptionIsValid) { 4084 const error = { message: "Shipping is not available for this location" }; 4085 errors.fields.shippingOption = error; 4086 errors.globalErrors.push(error); 4087 } 4088 return cleanupEmptyErrors(errors); 4089} 4090function tosErrors(accepted, present, showTosErrors) { 4091 if (present && showTosErrors && !accepted) { 4092 return { globalErrors: [{ message: "You must accept the terms of service" }] }; 4093 } else { 4094 return {}; 4095 } 4096} 4097function summaryErrors(summary) { 4098 const errors = { 4099 globalErrors: [], 4100 fields: {} 4101 }; 4102 if (summary.state == SummaryStates.ERROR) { 4103 if (summary.error) { 4104 errors.globalErrors.push({ message: summary.error.message }); 4105 } else { 4106 errors.globalErrors.push({ message: "There was an error calculating your order total" }); 4107 } 4108 } 4109 return cleanupEmptyErrors(errors); 4110} 4111function addressErrors(address, showAllErrors, fields) { 4112 const errors = { 4113 globalErrors: [], 4114 fields: {} 4115 }; 4116 fields.forEach((field) => { 4117 const value = address[field]; 4118 if (value == void 0 && !showAllErrors) return; 4119 const { valid, message } = validateValue(field, value); 4120 if (!valid) { 4121 errors.fields[field] = { message }; 4122 } 4123 }); 4124 return cleanupEmptyErrors(errors); 4125} 4126function contactErrors(contact, fields, showAllErrors) { 4127 showAllErrors = showAllErrors ?? true; 4128 const errors = { 4129 globalErrors: [], 4130 fields: {} 4131 }; 4132 fields.forEach((field) => { 4133 const value = contact[field]; 4134 if (value == void 0 && !showAllErrors) return; 4135 const { valid, message } = validateValue(field, value); 4136 if (!valid) { 4137 errors.fields[field] = { message }; 4138 } 4139 }); 4140 return cleanupEmptyErrors(errors); 4141} 4142function buildUtils() { 4143 const billingErrors = (billing, billingSameAsShipping, showAllErrors, cart, mode, billingFields, billingApiErrorsByField, paymentType, paymentId) => { 4144 if (hasPhysicalProductsWithParams(cart) && billingSameAsShipping || mode == CheckoutStates.UPGRADE_DOWNGRADE || mode == CheckoutStates.OTO && !paymentId || paymentType == "apple-pay") { 4145 return null; 4146 } else if (billingApiErrorsByField) { 4147 return { 4148 fields: billingApiErrorsByField 4149 }; 4150 } else if (mode == globalThis.Checkout.CheckoutStates.REACTIVATE || mode == globalThis.Checkout.CheckoutStates.SAVED) { 4151 const savedBillingAddresses = globalThis.Checkout.store.billing_addresses.get(); 4152 const isActiveAddressSaved = savedBillingAddresses.find((addr) => addr.id == billing.id); 4153 if (!isActiveAddressSaved) { 4154 return addressErrors(billing, showAllErrors, billingFields); 4155 } 4156 return null; 4157 } else if (mode == CheckoutStates.OTO && paymentId) { 4158 return null; 4159 } else { 4160 return addressErrors(billing, showAllErrors, billingFields); 4161 } 4162 }; 4163 const shippingErrors = (shipping, showAllErrors, cart, mode, shippingFields, paymentType) => { 4164 if (!hasPhysicalProductsWithParams(cart) || paymentType == "apple-pay") { 4165 return null; 4166 } 4167 return addressErrors(shipping, showAllErrors, shippingFields); 4168 }; 4169 return { 4170 productErrors, 4171 billingErrors, 4172 shippingErrors, 4173 addressErrors, 4174 cleanupEmptyErrors, 4175 hasErrors, 4176 hasPhysicalProductsWithParams, 4177 skipBillingAddress: (store) => { 4178 const isNotDigitalWalletPayment = store.payment.type.get() != "apple-pay"; 4179 return isNotDigitalWalletPayment && store.billingFields.get().length == 0; 4180 }, 4181 hasPhysicalProducts: () => { 4182 const cart = globalThis.Checkout.computed.checkoutCart.get(); 4183 return hasPhysicalProductsWithParams(cart); 4184 }, 4185 hasValidDataForOrderPreview: (options) => { 4186 const mode = globalThis.Checkout.store.checkout.mode.get(); 4187 const cart = globalThis.Checkout.computed.checkoutCart.get(); 4188 const billing = globalThis.Checkout.store.billing.get(); 4189 const shipping = globalThis.Checkout.store.shipping.get(); 4190 const billingSameAsShipping = globalThis.Checkout.store.billingSameAsShipping.get(); 4191 const billingApiErrorsByField = globalThis.Checkout.store.billingApiErrorsByField.get(); 4192 const paymentType = globalThis.Checkout.store.payment.type.get(); 4193 const paymentId = globalThis.Checkout.store.payment.id.get(); 4194 const showAllBillingErrors = true; 4195 const showAllShippingErrors = true; 4196 const showAllProductErrors = true; 4197 const pErrors = productErrors(cart, showAllProductErrors); 4198 const bErrors = billingErrors( 4199 billing, 4200 billingSameAsShipping, 4201 showAllBillingErrors, 4202 cart, 4203 mode, 4204 options.billingFields, 4205 billingApiErrorsByField, 4206 paymentType, 4207 paymentId 4208 ); 4209 const sErrors = shippingErrors(shipping, showAllShippingErrors, cart, mode, options.shippingFields, paymentType); 4210 return !hasErrors(pErrors) && !hasErrors(bErrors) && !hasErrors(sErrors); 4211 }, 4212 hasValidDataForShippingOptions: (options) => { 4213 const mode = globalThis.Checkout.store.checkout.mode.get(); 4214 const cart = globalThis.Checkout.computed.checkoutCart.get(); 4215 const shipping = globalThis.Checkout.store.shipping.get(); 4216 const paymentType = globalThis.Checkout.store.payment.type.get(); 4217 const showAllShippingErrors = true; 4218 const sErrors = shippingErrors(shipping, showAllShippingErrors, cart, mode, options.shippingFields, paymentType); 4219 return !hasErrors(sErrors); 4220 }, 4221 hasValidDataForTaxes: (options) => { 4222 const mode = globalThis.Checkout.store.checkout.mode.get(); 4223 const cart = globalThis.Checkout.computed.checkoutCart.get(); 4224 const billing = globalThis.Checkout.store.billing.get(); 4225 const billingSameAsShipping = globalThis.Checkout.store.billingSameAsShipping.get(); 4226 const billingApiErrorsByField = globalThis.Checkout.store.billingApiErrorsByField.get(); 4227 const paymentType = globalThis.Checkout.store.payment.type.get(); 4228 const paymentId = globalThis.Checkout.store.payment.id.get(); 4229 const showAllBillingErrors = true; 4230 const bErrors = billingErrors( 4231 billing, 4232 billingSameAsShipping, 4233 showAllBillingErrors, 4234 cart, 4235 mode, 4236 options.billingFields, 4237 billingApiErrorsByField, 4238 paymentType, 4239 paymentId 4240 ); 4241 return !hasErrors(bErrors); 4242 }, 4243 canSubmit: () => { 4244 const state = globalThis.Checkout.store.state.get(); 4245 const summary = globalThis.Checkout.store.summary.get(); 4246 return state == globalThis.Checkout.StoreStates.FILLING_FORM && summary.state == globalThis.Checkout.SummaryStates.OK; 4247 } 4248 }; 4249} 4250
4251// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-store.ts 4252var encodeVirtualInstallmentId = (duration, type) => { 4253 return `${duration}-${type}`; 4254}; 4255var decodeVirtualInstallmentId = (virtualId) => { 4256 if (!virtualId) return null; 4257 const parts = virtualId.split("-"); 4258 if (parts.length !== 2) return null; 4259 const duration = parseInt(parts[0], 10); 4260 const type = parts[1]; 4261 if (isNaN(duration)) return null; 4262 return { duration, type }; 4263}; 4264var getInitialCriticalErrors = (enabledPayments, enabledExpressPayments) => { 4265 const initialCriticalErrors = []; 4266 if ((enabledPayments ?? []).length == 0 && (enabledExpressPayments ?? []).length == 0) { 4267 initialCriticalErrors.push({ code: ERROR_CODES.EMPTY_PAYMENT_METHODS_ERROR }); 4268 } 4269 if (!globalThis.globalResourceData.productVariantWithNoBump?.id) { 4270 initialCriticalErrors.push({ code: ERROR_CODES.EMPTY_PRODUCTS_ERROR }); 4271 } 4272 return initialCriticalErrors; 4273}; 4274var create = (billingFields, shippingFields, enabledPayments, enabledExpressPayments) => { 4275 const paymentMethods = typeof globalThis.Checkout.savedPaymentMethods === "string" ? JSON.parse(globalThis.Checkout.savedPaymentMethods) : globalThis.Checkout.savedPaymentMethods; 4276 const paymentDataId = paymentMethods?.[0]?.id ?? null; 4277 const paymentDataType = paymentMethods?.[0]?.type; 4278 let initialPaymentMethod = paymentDataType ?? enabledPayments[0]; 4279 initialPaymentMethod = initialPaymentMethod == "splitit" ? "payment-card" : initialPaymentMethod; 4280 const { 4281 mode, 4282 contact, 4283 shipping, 4284 billing, 4285 billingSameAsShipping, 4286 billing_addresses, 4287 shipping_addresses 4288 } = globalThis.Checkout.ssrDynamicData; 4289 return { 4290 state: atom(globalThis.Checkout.StoreStates.START), 4291 checkout: { 4292 mode: atom(mode), 4293 lastModeIndependentOfCartItems: atom(mode), 4294 step: atom(0) 4295 }, 4296 contact: map(contact), 4297 contact_pending_auth: map({ authenticated: false }), 4298 shipping: map(shipping), 4299 shipping_addresses: atom(shipping_addresses ?? []), 4300 loadingShipping: atom(false), 4301 shippingOptions: atom([]), 4302 isUpdatingRebilly: atom(true), 4303 shippingOption: atom(), 4304 billingFields: atom(billingFields), 4305 shippingFields: atom(shippingFields), 4306 payment: { 4307 state: atom(globalThis.Checkout.PaymentStates.START), 4308 id: atom(paymentDataId), 4309 type: atom(initialPaymentMethod), 4310 virtualInstallmentId: atom(null), 4311 "payment-card": { 4312 events: map({}), 4313 token: atom(null) 4314 }, 4315 paypal: { 4316 state: atom({ state: globalThis.Checkout.PaypalStates.IDLE }), 4317 token: atom(null) 4318 }, 4319 "apple-pay": { 4320 token: atom(null) 4321 }, 4322 Klarna: { 4323 token: atom(null) 4324 } 4325 }, 4326 paymentMethods: atom(paymentMethods ?? []), 4327 billing: map(billing), 4328 billingApiErrorsByField: atom(null), 4329 billing_addresses: atom(billing_addresses ?? []), 4330 billingSameAsShipping: atom(billingSameAsShipping), 4331 coupons: { 4332 appliedCode: atom(""), 4333 currentCode: atom(""), 4334 errorMessage: atom(""), 4335 state: atom(globalThis.Checkout.CouponStates.READY) 4336 }, 4337 summary: atom({ 4338 state: globalThis.Checkout.SummaryStates.WAITING, 4339 data: {} 4340 }), 4341 tos: { 4342 accepted: atom(false), 4343 present: atom(false) 4344 }, 4345 criticalErrors: atom(getInitialCriticalErrors(enabledPayments, enabledExpressPayments)), 4346 showAllErrors: { 4347 contact: atom(false), 4348 shipping: atom(false), 4349 billing: atom(false), 4350 shippingOption: atom(false), 4351 payment: atom(false), 4352 products: atom(false), 4353 tos: atom(false), 4354 summary: atom(false) 4355 }, 4356 submitting: atom({ 4357 state: globalThis.Checkout.SubmittingStates.IDLE 4358 }), 4359 incrScrollToFirstVisibleError: atom(0), 4360 threeds: map({ 4361 show: false, 4362 approvalUrl: null 4363 }), 4364 featureFlags: { 4365 isShippingEnabled: atom(false) 4366 }, 4367 selectedOrderDetailId: atom(null), 4368 phoneNumberInitialized: atom(false) 4369 }; 4370}; 4371var buildComputed = (store, contactFields, shippingFields, totalSteps) => { 4372 const computedModeLeaveEnterEvent = atom({}); 4373 onMount(computedModeLeaveEnterEvent, () => { 4374 let previousMode; 4375 return store.checkout.mode.subscribe((mode) => { 4376 if (previousMode) {
4377 computedModeLeaveEnterEvent.set({ 4378 leave: previousMode, 4379 next: mode 4380 }); 4381 } 4382 computedModeLeaveEnterEvent.set({ 4383 enter: mode, 4384 previous: previousMode 4385 }); 4386 previousMode = mode; 4387 }); 4388 }); 4389 const computedContactErrors = computed( 4390 [store.checkout.mode, store.contact, store.showAllErrors.contact], 4391 (mode, contact, showAllErrors) => { 4392 if (mode != globalThis.Checkout.CheckoutStates.GUEST) return null; 4393 return contactErrors(contact, contactFields, showAllErrors); 4394 } 4395 ); 4396 const computedCheckoutCart = buildProductSelectComputed(); 4397 const computedBillingErrors = computed( 4398 [ 4399 store.billing, 4400 store.billingSameAsShipping, 4401 store.showAllErrors.billing, 4402 computedCheckoutCart, 4403 store.checkout.mode, 4404 store.payment.type, 4405 store.payment.id, 4406 store.billingApiErrorsByField, 4407 store.billingFields 4408 ], 4409 (billing, billingSameAsShipping, showAllErrors, cart, mode, paymentType, paymentId, billingApiErrorsByField, billingFields) => { 4410 return globalThis.Checkout.utils.billingErrors( 4411 billing, 4412 billingSameAsShipping, 4413 showAllErrors, 4414 cart, 4415 mode, 4416 billingFields, 4417 billingApiErrorsByField, 4418 paymentType, 4419 paymentId 4420 ); 4421 } 4422 ); 4423 const computedShippingErrors = computed( 4424 [store.shipping, store.showAllErrors.shipping, computedCheckoutCart, store.checkout.mode, store.payment.type], 4425 (shipping, showAllErrors, cart, mode, paymentType) => { 4426 return globalThis.Checkout.utils.shippingErrors(shipping, showAllErrors, cart, mode, shippingFields, paymentType); 4427 } 4428 ); 4429 const computedHasValidShippingAddress = computed( 4430 [computedCheckoutCart, store.shipping, store.checkout.mode], 4431 (cart, shipping, mode) => { 4432 return !globalThis.Checkout.utils.shippingErrors(shipping, true, cart, mode, shippingFields); 4433 } 4434 ); 4435 const computedProductErrors = computed( 4436 [computedCheckoutCart, store.showAllErrors.products], 4437 (cart, showAllErrors) => { 4438 return globalThis.Checkout.utils.productErrors(cart, showAllErrors); 4439 } 4440 ); 4441 const computedShippingOptionErrors = computed( 4442 [ 4443 store.loadingShipping, 4444 computedCheckoutCart, 4445 store.shippingOptions, 4446 store.shippingOption, 4447 store.showAllErrors.shippingOption, 4448 store.payment.type 4449 ], 4450 (...args) => shippingOptionErrors(...args) 4451 ); 4452 const computedPaymentErrors = computed( 4453 [ 4454 store.payment.id, 4455 store.payment.type, 4456 store.payment["payment-card"].events, 4457 store.payment.paypal.state, 4458 store.payment.paypal.token, 4459 store.showAllErrors.payment, 4460 store.checkout.mode 4461 ], 4462 (id, type, cardEvents, paypalState, paypalToken, showAllErrors, mode) => { 4463 const errors = { 4464 globalErrors: [], 4465 fields: {} 4466 }; 4467 if (!id && mode != globalThis.Checkout.CheckoutStates.UPGRADE_DOWNGRADE) { 4468 if (type == "payment-card") { 4469 let hasEvent = !!Object.keys(cardEvents).length; 4470 if (hasEvent) { 4471 Object.entries(cardEvents).forEach(([field, event]) => { 4472 if (!event) { 4473 event = { source: field }; 4474 } else { 4475 hasEvent = true; 4476 } 4477 const { valid, message } = validateValue("card", event); 4478 if (!valid) { 4479 errors.fields[field] = { message }; 4480 } 4481 }); 4482 } else if (showAllErrors) { 4483 errors.globalErrors.push({ message: "Missing payment information" }); 4484 } 4485 } else if (type == "paypal") { 4486 if (showAllErrors && !(paypalState.state == globalThis.Checkout.PaypalStates.PAYMENT_METHOD_APPROVED && paypalToken)) { 4487 errors.globalErrors.push({ message: "Missing payment information" }); 4488 } 4489 } 4490 } 4491 return cleanupEmptyErrors(errors); 4492 } 4493 ); 4494 const computedTosErrors = computed( 4495 [store.tos.accepted, store.tos.present, store.showAllErrors.tos], 4496 (...args) => tosErrors(...args) 4497 ); 4498 const computedSummaryErrors = computed([store.summary], (summary) => summaryErrors(summary)); 4499 const computedErrorsByName = { 4500 contact: computedContactErrors, 4501 billing: computedBillingErrors, 4502 shipping: computedShippingErrors, 4503 shippingOption: computedShippingOptionErrors, 4504 products: computedProductErrors, 4505 payment: computedPaymentErrors, 4506 tos: computedTosErrors, 4507 summary: computedSummaryErrors 4508 }; 4509 const computedHasPhysicalProducts = computed(computedCheckoutCart, (cart) => { 4510 return globalThis.Checkout.utils.hasPhysicalProductsWithParams(cart); 4511 }); 4512 const computedPossibleOtoWithFreeShipping = computed( 4513 [computedCheckoutCart, store.checkout.mode, store.shippingOptions, store.loadingShipping], 4514 (cart, mode, shippingOptions, loadingShipping) => { 4515 return mode === "oto" && globalThis.Checkout.utils.hasPhysicalProductsWithParams(cart) && // shipping options unknown /
4515not loaded 4516 (!shippingOptions || // pending with no current shipping options 4517 loadingShipping && shippingOptions.length === 0 || // Exactly one shipping option with amount zero 4518 shippingOptions?.length === 1 && parseInt(shippingOptions[0].amount.amount) === 0); 4519 } 4520 ); 4521 const computedHasShippingEnabled = computed( 4522 [computedCheckoutCart, store.featureFlags.isShippingEnabled], 4523 (cart, isShippingEnabled) => { 4524 return globalThis.Checkout.utils.hasPhysicalProductsWithParams(cart) && isShippingEnabled; 4525 } 4526 ); 4527 const computedHideShipping = computed( 4528 [computedHasShippingEnabled, computedPossibleOtoWithFreeShipping], 4529 (isShippingEnabled, possibleOtoWithFreeShipping) => { 4530 return !isShippingEnabled || possibleOtoWithFreeShipping; 4531 } 4532 ); 4533 const computedCurrentPaymentMethod = computed([store.payment.id], (currentPaymentId) => { 4534 return store.paymentMethods.get().find((pm) => pm.id == currentPaymentId); 4535 }); 4536 const computedIsCouponReady = computed([store.state, computedCheckoutCart], (state, cart) => { 4537 const showAllProductErrors = true; 4538 const pErrors = globalThis.Checkout.utils.productErrors(cart, showAllProductErrors); 4539 return state == globalThis.Checkout.StoreStates.FILLING_FORM && !globalThis.Checkout.utils.hasErrors(pErrors); 4540 }); 4541 const computedIsDigitalWalletReadyToStart = computed( 4542 [store.checkout.mode, store.state, store.summary, computedCheckoutCart], 4543 (mode, state, summary, cart) => { 4544 const showAllProductErrors = true; 4545 const pErrors = globalThis.Checkout.utils.productErrors(cart, showAllProductErrors); 4546 return state == globalThis.Checkout.StoreStates.FILLING_FORM && !globalThis.Checkout.utils.hasErrors(pErrors); 4547 } 4548 ); 4549 const computedHideContactInformationForm = computed( 4550 [store.checkout.mode, store.payment.type], 4551 (mode, paymentType) => { 4552 return paymentType == "apple-pay" && mode == "guest" && totalSteps == 1; 4553 } 4554 ); 4555 const computedIsOTORetrialPayment = computed( 4556 [store.checkout.mode, store.payment.id], 4557 (mode, paymentId) => mode == globalThis.Checkout.CheckoutStates.OTO && !paymentId 4558 ); 4559 return { 4560 errorsByName: computedErrorsByName, 4561 modeLeaveEnterEvent: computedModeLeaveEnterEvent, 4562 hasPhysicalProducts: computedHasPhysicalProducts, 4563 hasShippingEnabled: computedHasShippingEnabled, 4564 hideShipping: computedHideShipping, 4565 hasValidShippingAddress: computedHasValidShippingAddress, 4566 isDigitalWalletReadyToStart: computedIsDigitalWalletReadyToStart, 4567 isCouponReady: computedIsCouponReady, 4568 contactErrors: computedContactErrors, 4569 productErrors: computedProductErrors, 4570 billingErrors: computedBillingErrors, 4571 shippingErrors: computedShippingErrors, 4572 shippingOptionErrors: computedShippingOptionErrors, 4573 paymentMethod: computedCurrentPaymentMethod, 4574 paymentErrors: computedPaymentErrors, 4575 tosErrors: computedTosErrors, 4576 summaryErrors: computedSummaryErrors, 4577 hideContactInformationForm: computedHideContactInformationForm, 4578 isOTORetrialPayment: computedIsOTORetrialPayment, 4579 isNewDigitalWalletPayment: computed( 4580 [store.payment.id, store.payment.type], 4581 (id, paymentType) => !id && paymentType == "apple-pay" 4582 ), 4583 checkoutCart: computedCheckoutCart 4584 }; 4585}; 4586var initializeUtilities = (store, computed2) => { 4587 initializeStoreUtilities(store, computed2); 4588 setupCFEnableDevTools(); 4589}; 4590var initializeStoreUtilities = (store, computed2) => { 4591 const proxyCache = /* @__PURE__ */ new WeakMap(); 4592 const storeValueCache = /* @__PURE__ */ new WeakMap(); 4593 const DEBOUNCE_INTERVAL = 50; 4594 const stores = { 4595 store, 4596 computed: computed2 4597 }; 4598 function createDeepNanostoreProxy(target, onChange) { 4599 return new Proxy(target, { 4600 get(target2, property) { 4601 const item = target2[property]; 4602 if (property === "__store") { 4603 return item; 4604 } 4605 if (item && typeof item === "object") { 4606 if (proxyCache.has(item)) return proxyCache.get(item); 4607 if (isStore(item)) { 4608 const __store = item;
4609 const storeValue = { 4610 __store, 4611 __value: peek(__store) 4612 }; 4613 storeValueCache.set(item, storeValue); 4614 __store.listen((value) => { 4615 storeValue.__value = value; 4616 onChange(); 4617 }); 4618 return storeValue; 4619 } else { 4620 const proxy2 = createDeepNanostoreProxy(item, onChange); 4621 proxyCache.set(item, proxy2); 4622 return proxy2; 4623 } 4624 } 4625 return item; 4626 } 4627 }); 4628 } 4629 function peek(store2) { 4630 return store2.value; 4631 } 4632 function isStore(value) { 4633 return value && value.subscribe; 4634 } 4635 let debounceTimeout; 4636 const proxy = createDeepNanostoreProxy(stores, function onChange() { 4637 clearTimeout(debounceTimeout); 4638 debounceTimeout = setTimeout(() => { 4639 window.dispatchEvent(new CustomEvent("checkout:store:change")); 4640 }, DEBOUNCE_INTERVAL); 4641 }); 4642 globalThis.Checkout.utils.getStoreJson = (tab = 0) => { 4643 return JSON.stringify( 4644 proxy, 4645 function replacer(key, value) { 4646 if (["__store"].includes(key)) return; 4647 if (value && Object.prototype.hasOwnProperty.call(value, "__value")) { 4648 return value.__value; 4649 } 4650 return value; 4651 }, 4652 tab 4653 ); 4654 }; 4655}; 4656var setupCFEnableDevTools = () => { 4657 if (localStorage.getItem("cf2:devtools:enabled")) { 4658 trackUpdatesCheckoutUpdates(); 4659 } 4660 globalThis.CFEnableDevTools = () => { 4661 localStorage.setItem("cf2:devtools:enabled", "true"); 4662 trackUpdatesCheckoutUpdates(); 4663 }; 4664 function trackUpdatesCheckoutUpdates() { 4665 document.querySelectorAll('[data-page-element="Checkout/V2"]').forEach((el) => { 4666 el.insertAdjacentHTML("afterend", '<div class="checkout-store-log"><pre></pre></div>'); 4667 document.querySelector(".checkout-store-log").style.cssText = ` 4668 z-index: 10; 4669 top: 0; 4670 background: rgba(100,100,1005,0.1); 4671 height: 100; 4672 display: flex; 4673 flex-direction: column; 4674 justify-content: center;`; 4675 document.querySelector(".checkout-store-log pre").style.cssText = ` 4676 font-size: 12px; 4677 font-weight: bold; 4678 width: fit-content;`; 4679 }); 4680 const checkoutStoreLog = document.querySelector(".checkout-store-log"); 4681 const renderDevToolsState = initReduxDevTools().render; 4682 render(); 4683 window.addEventListener("checkout:store:change", () => { 4684 render(); 4685 if (renderDevToolsState) { 4686 renderDevToolsState(); 4687 } 4688 }); 4689 function initReduxDevTools() { 4690 let store; 4691 const reduxUrl = "https://cdnjs.cloudflare.com/ajax/libs/redux/4.2.1/redux.min.js"; 4692 const scriptEle = document.createElement("script"); 4693 scriptEle.setAttribute("src", reduxUrl); 4694 document.body.appendChild(scriptEle); 4695 scriptEle.addEventListener("load", () => { 4696 store = globalThis.Redux.createStore( 4697 (state, action) => action.state || state, 4698 JSON.parse(globalThis.Checkout.utils.getStoreJson()), 4699 globalThis.__REDUX_DEVTOOLS_EXTENSION__ && globalThis.__REDUX_DEVTOOLS_EXTENSION__() 4700 ); 4701 }); 4702 return { 4703 render() { 4704 if (store) { 4705 store.dispatch({ 4706 type: "state", 4707 state: JSON.parse(globalThis.Checkout.utils.getStoreJson()) 4708 }); 4709 } 4710 } 4711 }; 4712 } 4713 function render() { 4714 let json; 4715 let error; 4716 try { 4717 const data = JSON.parse(globalThis.Checkout.utils.getStoreJson(4)); 4718 json = JSON.stringify(data, null, 2); 4719 } catch (err) { 4720 error = err; 4721 console.log(error); 4722 } 4723 checkoutStoreLog.querySelector("pre").innerHTML = error ? error.message : ["--- State ---", json].join("\n"); 4724 } 4725 } 4726}; 4727
4728// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-submit.ts 4729var REBILLY_PAYMENT_METHOD_BY_TYPE_MAP = { 4730 Klarna: "klarna-payments" 4731}; 4732var _redirecTo, _threedsListenerEnabled, _formSubmitPayload, _CheckoutSubmit_static, leadSourceGenerator_fn, submitRebilly_fn, buildPaymentMethodDetails_fn, buildRegistrationDetails_fn, shouldIncludeRegistration_fn, buildAddressParams_fn, submitOrderAsync_fn, handleFormSubmitRedirect_fn, add3dsListener_fn; 4733var CheckoutSubmit = class { 4734 static submitFromButtonClick(submitButton, onValidationError, redirectOverride) { 4735 __privateMethod(this, _CheckoutSubmit_static, add3dsListener_fn).call(this); 4736 const checkoutElement = submitButton.closest(".elCheckout"); 4737 if (this.checkSubmitShowErrors({ skipFields: /* @__PURE__ */ new Set(["payment"]) }) && this.checkSubmitShowErrors({ onlyFields: /* @__PURE__ */ new Set(["payment"]) }) && globalThis.Checkout.utils.canSubmit() && checkValidCustomFields(checkoutElement)) { 4738 globalThis.Checkout.store.state.set(globalThis.Checkout.StoreStates.SUBMITTING); 4739 globalThis.Checkout.store.submitting.set({ 4740 state: globalThis.Checkout.SubmittingStates.START 4741 }); 4742 const isUpgradeDowngrade = globalThis.Checkout.store.checkout.mode.get() == globalThis.Checkout.CheckoutStates.UPGRADE_DOWNGRADE; 4743 const capturedPaymentMethodId = globalThis.Checkout.store.payment.id.get(); 4744 const canSkipSubmitRebilly = isUpgradeDowngrade || capturedPaymentMethodId; 4745 if (canSkipSubmitRebilly) { 4746 const payload = this.buildPayloadFromStore({ 4747 contact: globalThis.Checkout.store.contact.get(), 4748 turnstileToken: globalThis.Checkout.turnstileToken, 4749 shippingAddress: globalThis.Checkout.store.shipping.get(), 4750 billingAddress: globalThis.Checkout.store.billing.get(), 4751 paymentMethodDetails: __privateMethod(this, _CheckoutSubmit_static, buildPaymentMethodDetails_fn).call(this) ?? {}, 4752 selectedShippingOption: globalThis.Checkout.store.shippingOption.get(), 4753 skipBillingAddress: globalThis.Checkout.utils.skipBillingAddress(globalThis.Checkout.store), 4754 redirectOverride 4755 }); 4756 return this.submit(payload); 4757 } else { 4758 const paymentType = globalThis.Checkout.store.payment.type.get(); 4759 if (["Klarna", "payment-card"].includes(paymentType)) { 4760 return __privateMethod(this, _CheckoutSubmit_static, submitRebilly_fn).call(this, onValidationError).then((tokenData) => { 4761 if (!tokenData && paymentType === "Klarna") { 4762 if (globalThis.Checkout.store.state.get() === globalThis.Checkout.StoreStates.SUBMITTING) { 4763 globalThis.Checkout.store.state.set(globalThis.Checkout.StoreStates.FILLING_FORM); 4764 globalThis.Checkout.store.submitting.set({ 4765 state: globalThis.Checkout.SubmittingStates.IDLE 4766 }); 4767 } 4768 return; 4769 } 4770 globalThis.Checkout.store.payment[paymentType].token.set(tokenData.id); 4771 const payload = this.buildPayloadFromStore({ 4772 contact: globalThis.Checkout.store.contact.get(), 4773 turnstileToken: globalThis.Checkout.turnstileToken, 4774 shippingAddress: globalThis.Checkout.store.shipping.get(), 4775 billingAddress: globalThis.Checkout.store.billing.get(), 4776 paymentMethodDetails: __privateMethod(this, _CheckoutSubmit_static, buildPaymentMethodDetails_fn).call(this) ?? {}, 4777 selectedShippingOption: globalThis.Checkout.store.shippingOption.get(), 4778 skipBillingAddress: globalThis.Checkout.utils.skipBillingAddress(globalThis.Checkout.store), 4779 redirectOverride 4780 }); 4781 return this.submit(payload); 4782 }); 4783 } else { 4784 const payload = this.buildPayloadFromStore({ 4785 contact: globalThis.Checkout.store.contact.get(), 4786 turnstileToken: globalThis.Checkout.turnstileToken, 4787 shippingAddress: globalThis.Checkout.store.shipping.get(), 4788 billingAddress: globalThis.Checkout.store.billing.get(), 4789 paymentMethodDetails: __privateMethod(this, _CheckoutSubmit_static, buildPaymentMethodDetails_fn).call(this) ?? {}, 4790 selectedShippingOption: globalThis.Checkout.store.shippingOption.get(), 4791 skipBillingAddress: globalThis.Checkout.utils.skipBillingAddress(globalThis.Checkout.store), 4792 redirectOverride 4793 }); 4794 return this.submit(payload); 4795 } 4796 } 4797 } else { 4798 onValidationError(); 4799 } 4800 } 4801 static checkSubmitShowErrors(options) { 4802 const { onlyFields, skipFields } = options ?? {}; 4803 return Object.entries(globalThis.Checkout.computed.errorsByName).map(([name, computed2]) => { 4804 if (onlyFields && !onlyFields.has(name)) return true; 4805 if (skipFields && skipFields.has(name)) return true; 4806 globalThis.Checkout.store.showAllErrors[name].set(true); 4807 return !globalThis.Checkout.utils.hasErrors(computed2.get()); 4808 }).every((v) => !!v); 4809 } 4810 static buildPayloadFromStore(payload) { 4811 const addressParams = __privateMethod(this, _CheckoutSubmit_static, buildAddressParams_fn).call(this, { 4812 billingAddress: payload.billingAddress, 4813 shippingAddress: payload.shippingAddress 4814 }, {
4815 skipBillingAddress: payload.skipBillingAddress 4816 }) ?? {}; 4817 const paymentDetails = payload.paymentMethodDetails; 4818 const purchaseCartDetails = this.buildPurchaseCartDetails(); 4819 const customFields = buildCustomFields(); 4820 const contact = payload.contact; 4821 const couponCode = globalThis.Checkout.store.coupons.appliedCode.get(); 4822 const couponData = couponCode ? { coupon_codes: [couponCode] } : {}; 4823 const virtualInstallmentId = globalThis.Checkout.store.payment.virtualInstallmentId.get(); 4824 const installmentData = decodeVirtualInstallmentId(virtualInstallmentId); 4825 const rebillyPayload = { 4826 // NOTE: Temp fix for FHL 2023 4827 ...customFields ? customFields : {}, 4828 contact: { 4829 ...contact, 4830 ...addressParams.shipping ?? {} 4831 }, 4832 turnstileToken: payload.turnstileToken, 4833 ...addressParams.billing ?? {}, 4834 purchase: { 4835 ...couponData, 4836 ...purchaseCartDetails, 4837 ...paymentDetails, 4838 process_new_order: true, 4839 ...paymentDetails?.payment_method_type === "payment-card" && installmentData ? { 4840 installment_duration: installmentData.duration, 4841 installment_type: installmentData.type 4842 } : {} 4843 }, 4844 skip_billing_address: Boolean(payload.skipBillingAddress), 4845 skip_optin_track: document.getElementById("cfAR")?.getAttribute("data-leads-collected") === "true" 4846 }; 4847 if (__privateMethod(this, _CheckoutSubmit_static, shouldIncludeRegistration_fn).call(this)) rebillyPayload["registration"] = __privateMethod(this, _CheckoutSubmit_static, buildRegistrationDetails_fn).call(this); 4848 const selected_shipping_option = payload.selectedShippingOption; 4849 if (selected_shipping_option && Object.keys(selected_shipping_option).length > 1) { 4850 rebillyPayload.purchase.selected_shipping_option = selected_shipping_option; 4851 } 4852 const redirectUrl = payload.redirectOverride || __privateGet(this, _redirecTo); 4853 if (redirectUrl) { 4854 rebillyPayload.redirect_to = redirectUrl; 4855 } 4856 return rebillyPayload; 4857 } 4858 static generateShippingOptionId(shippingOption) { 4859 return [shippingOption.description, shippingOption.amount_formatted].join("$"); 4860 } 4861 static buildDigitalWalletTransactionData(summaryData, cart, shippingEnabled, shippingOptions) { 4862 const { line_items } = summaryData; 4863 const lineItems = line_items.map(({ price, description }, index) => { 4864 let label; 4865 if (line_items.length == cart.items.length) { 4866 const variantId = cart.items[index].variant_id; 4867 const variant = globalThis.Checkout.variantsById[variantId]; 4868 label = variant.name; 4869 } else { 4870 label = description; 4871 } 4872 return { 4873 label, 4874 amount: price 4875 }; 4876 }); 4877 if (summaryData.tax?.amount > 0) { 4878 lineItems.push({ 4879 label: "Taxes", 4880 amount: summaryData.tax.amount 4881 }); 4882 } 4883 if (summaryData.shipping?.amount > 0) { 4884 lineItems.push({ 4885 label: "Shipping", 4886 amount: summaryData.shipping.amount 4887 }); 4888 } 4889 if (summaryData.discount?.amount > 0) { 4890 lineItems.push({ 4891 label: "Discount", 4892 amount: -summaryData.discount?.amount 4893 }); 4894 } 4895 return { 4896 amount: summaryData.total.amount, 4897 lineItems, 4898 ...shippingEnabled ? { 4899 status: shippingOptions.length ? "success" : "fail", 4900 shippingOptions: shippingOptions.map((shippingOption) => ({ 4901 id: this.generateShippingOptionId(shippingOption), 4902 label: shippingOption.description, 4903 description: "", 4904 amount: Number(shippingOption.amount.amount) 4905 })) 4906 } : {} 4907 }; 4908 } 4909 static buildPurchaseCartDetails() { 4910 const checkoutCart = globalThis.Checkout.computed.checkoutCart.get(); 4911 const lineItems = checkoutCart.items.map( 4912 ({ variant_id, price_id, line_item_id, quantity }) => { 4913 return { 4914 id: variant_id, 4915 quantity, 4916 price_id, 4917 ...line_item_id ? { line_item_id } : {} 4918 }; 4919 } 4920 ); 4921 return { order_id: checkoutCart.order_id, product_variants: lineItems }; 4922 } 4923 static submit(payload) { 4924 if (localStorage.getItem("cf2:devtools:enabled")) { 4925 console.log("submitted data", payload); 4926 } 4927 const requestIdempotency = uuidv4();
4928 globalThis.CFDispatchEvent(globalThis.CFEvents.FORM_SUBMITTED, payload); 4929 let timer = null; 4930 __privateMethod(this, _CheckoutSubmit_static, submitOrderAsync_fn).call(this, payload, requestIdempotency, 3, () => { 4931 clearInterval(timer); 4932 globalThis.Checkout.store.submitting.set({ 4933 state: globalThis.Checkout.SubmittingStates.START 4934 }); 4935 }, (sleepTime) => { 4936 let remainingSeconds = sleepTime / 1e3; 4937 clearInterval(timer); 4938 timer = setInterval(() => { 4939 remainingSeconds -= 1; 4940 globalThis.Checkout.store.submitting.set({ 4941 state: globalThis.Checkout.SubmittingStates.WAITING_ON_QUEUE, 4942 remainingSeconds 4943 }); 4944 }, 1e3); 4945 }).then((response) => { 4946 if (response.status == 422) { 4947 response.json().then((responseJSON) => { 4948 const errorDetails = responseJSON.error_details; 4949 let errorDetailsMessage = responseJSON.error; 4950 if (responseJSON.error_details && !!errorDetails?.length) { 4951 errorDetailsMessage = errorDetails.map((e) => e.graceful_message ?? e.message).join("</br>"); 4952 const mode = globalThis.Checkout.store.checkout.mode.get(); 4953 const isRetrieablePayment = mode == globalThis.Checkout.CheckoutStates.OTO && errorDetails.find((e) => e.source == "payment_gateway"); 4954 if (isRetrieablePayment) { 4955 globalThis.Checkout.store.showAllErrors.payment.set(false); 4956 globalThis.Checkout.store.payment.id.set(null); 4957 } 4958 } 4959 globalThis.Checkout.store.submitting.set({ 4960 state: globalThis.Checkout.SubmittingStates.ERROR, 4961 code: globalThis.Checkout.ErrorTypes.SERVER_ERROR_WITH_MESSAGE, 4962 message: errorDetailsMessage 4963 }); 4964 }); 4965 } else if (response.ok) { 4966 __privateSet(this, _formSubmitPayload, payload); 4967 globalThis.CFDispatchEvent(globalThis.CFEvents.FORM_SUBMITTED_OK, payload); 4968 if (response.headers.get("X-CF2-APPROVAL-URL")) { 4969 globalThis.Checkout.store.threeds.set({ 4970 show: true, 4971 approvalUrl: response.headers.get("X-CF2-APPROVAL-URL") 4972 }); 4973 } else { 4974 globalThis.Checkout.store.submitting.set({ 4975 state: globalThis.Checkout.SubmittingStates.DONE 4976 }); 4977 globalThis.Checkout.store.state.set(globalThis.Checkout.StoreStates.SUBMITTED); 4978 globalThis.CFDispatchEvent(globalThis.CFEvents.FORM_SUBMITTED_FINALIZED, payload); 4979 __privateMethod(this, _CheckoutSubmit_static, handleFormSubmitRedirect_fn).call(this, response, response.headers.get("Location")); 4980 } 4981 } else if (response.status >= 300 && response.status < 400) { 4982 globalThis.Checkout.store.submitting.set({ 4983 state: globalThis.Checkout.SubmittingStates.DONE 4984 }); 4985 globalThis.Checkout.store.state.set(globalThis.Checkout.StoreStates.SUBMITTED); 4986 globalThis.CFDispatchEvent(globalThis.CFEvents.FORM_SUBMITTED_FINALIZED, payload); 4987 __privateMethod(this, _CheckoutSubmit_static, handleFormSubmitRedirect_fn).call(this, response, response.headers.get("Location") ?? globalThis.location.href); 4988 } else if (response.status === 429) { 4989 clearInterval(timer); 4990 globalThis.Checkout.store.submitting.set({ 4991 state: globalThis.Checkout.SubmittingStates.ERROR, 4992 code: globalThis.Checkout.ErrorTypes.EXCEEDED_MAX_RETRIES 4993 }); 4994 } else { 4995 globalThis.Checkout.store.submitting.set({ 4996 state: globalThis.Checkout.SubmittingStates.ERROR, 4997 code: globalThis.Checkout.ErrorTypes.UNHANDLED_SERVER_RESPONSE 4998 }); 4999 } 5000 }).catch((err) => { 5001 console.error(err); 5002 clearInterval(timer); 5003 globalThis.Checkout.store.submitting.set({ 5004 state: globalThis.Checkout.SubmittingStates.ERROR, 5005 code: globalThis.Checkout.ErrorTypes.SERVER_ERROR 5006 }); 5007 }); 5008 } 5009}; 5010_redirecTo = new WeakMap(); 5011_threedsListenerEnabled = new WeakMap(); 5012_formSubmitPayload = new WeakMap(); 5013_CheckoutSubmit_static = new WeakSet(); 5014leadSourceGenerator_fn = function() { 5015 const DEFAULT_MAX_CHARS_LENGTH = 512; 5016 const leadQueryParamMapping = { 5017 utm_source: { 5018 name: "source" 5019 }, 5020 utm_medium: { 5021 name: "medium" 5022 }, 5023 utm_campaign: { 5024 name: "campaign" 5025 }, 5026 utm_term: { 5027 name: "term" 5028 },
5029 utm_content: { 5030 name: "content" 5031 }, 5032 affiliate: {}, 5033 subAffiliate: {}, 5034 clickId: {}, 5035 salesAgent: {} 5036 }; 5037 const params = new URLSearchParams(globalThis.location.search); 5038 return Array.from(params.keys()).reduce((acc, key) => { 5039 const mappedValue = leadQueryParamMapping[key]; 5040 if (mappedValue) { 5041 const paramValue = params.get(key); 5042 const leadSourceName = mappedValue.name ?? key; 5043 acc[leadSourceName] = paramValue.substring(0, DEFAULT_MAX_CHARS_LENGTH); 5044 } 5045 return acc; 5046 }, {}); 5047}; 5048submitRebilly_fn = function(onValidationError) { 5049 const paymentType = globalThis.Checkout.store.payment.type.get(); 5050 const method = REBILLY_PAYMENT_METHOD_BY_TYPE_MAP[paymentType] ?? paymentType; 5051 const Rebilly = globalThis.Rebilly; 5052 let extraData = { method }; 5053 const leadSource = __privateMethod(this, _CheckoutSubmit_static, leadSourceGenerator_fn).call(this); 5054 if (Object.keys(leadSource).length) { 5055 extraData = { ...extraData, leadSource }; 5056 } 5057 const form = document.querySelector("#cfAR"); 5058 const rebillyDataMapping = { 5059 firstName: "first_name", 5060 lastName: "last_name", 5061 emails: "email", 5062 ...paymentType === "Klarna" ? { country: "country" } : {} 5063 }; 5064 const rebillyFieldKeyMapping = { 5065 "paymentInstrument.cvv": "cvv" 5066 }; 5067 Object.entries(rebillyDataMapping).forEach(([rebillyKey, dataKey]) => { 5068 const input = form.querySelector(`[data-rebilly="${rebillyKey}"]`); 5069 if (input) { 5070 let value = globalThis.Checkout.store.contact.get()[dataKey]; 5071 if (dataKey === "country") { 5072 const cartHasPhysicalProducts = hasPhysicalProducts(globalThis.Checkout.computed.checkoutCart.get()); 5073 const billingSameAsShipping = globalThis.Checkout.store.billingSameAsShipping.get(); 5074 const key = cartHasPhysicalProducts && billingSameAsShipping ? "shipping" : "billing"; 5075 value = globalThis.Checkout.store[key].get()[dataKey] ?? globalThis.Checkout.contactLocale.country; 5076 } 5077 input.value = value; 5078 } 5079 }); 5080 globalThis.clearBlankInputFields(); 5081 return Rebilly.createToken(form, extraData).catch((e) => { 5082 console.error(e); 5083 if (e.invalidFields && e.invalidFields.length) { 5084 e.invalidFields.forEach((error) => { 5085 const key = rebillyFieldKeyMapping[error.field]; 5086 if (key) { 5087 const event = { valid: false, error: { message: error.message } }; 5088 globalThis.Checkout.store.payment["payment-card"].events.setKey(key, event); 5089 } 5090 }); 5091 globalThis.Checkout.store.submitting.set({ 5092 state: globalThis.Checkout.SubmittingStates.ERROR, 5093 code: globalThis.Checkout.ErrorTypes.REBILLY_ERROR 5094 }); 5095 } else { 5096 let message = e.message; 5097 if (e.details.length) { 5098 const details = e.details.join(" - "); 5099 message = `${message} - ${details}`; 5100 } 5101 globalThis.Checkout.store.submitting.set({ 5102 state: globalThis.Checkout.SubmittingStates.ERROR, 5103 code: globalThis.Checkout.ErrorTypes.REBILLY_ERROR, 5104 message 5105 }); 5106 } 5107 onValidationError(e); 5108 }); 5109}; 5110buildPaymentMethodDetails_fn = function() { 5111 const mode = globalThis.Checkout.store.checkout.mode.get(); 5112 if (mode == globalThis.Checkout.CheckoutStates.UPGRADE_DOWNGRADE) return; 5113 const payment_method_type = globalThis.Checkout.store.payment.type.get(); 5114 const rebilly_token = globalThis.Checkout.store.payment[payment_method_type].token.get(); 5115 const payment_method_id = globalThis.Checkout.store.payment.id.get(); 5116 if (payment_method_id) return { payment_method_id, rebilly_token: null }; 5117 return { 5118 payment_method_id: null, 5119 payment_method_type, 5120 rebilly_token 5121 }; 5122}; 5123buildRegistrationDetails_fn = function() { 5124 return { 5125 calendar_event_id: document.getElementsByName("registration[calendar_event_id]")[0].value, 5126 occurs_at: document.getElementsByName("registration[occurs_at]")[0].value 5127 }; 5128}; 5129shouldIncludeRegistration_fn = function() { 5130 return document.getElementsByName("registration[calendar_event_id]")?.length > 0; 5131}; 5132buildAddressParams_fn = function(addressParams, options) { 5133 const mode = globalThis.Checkout.store.checkout.mode.get(); 5134 const billing = addressParams.billingAddress ?? {}; 5135 const shipping = addressParams.shippingAddress ?? {}; 5136 const checkoutCart = globalThis.Checkout.computed.checkoutCart.get(); 5137 if (mode == globalThis.Checkout.CheckoutStates.UPGRADE_DOWNGRADE && !hasPhysicalProducts(checkoutCart)) { 5138 return; 5139 } 5140 let billing_address_attributes, physical_address_attributes; 5141 if (mode !== globalThis.Checkout.CheckoutStates.UPGRADE_DOWNGRADE) { 5142 if (isSavedAddress(billing)) { 5143 billing_address_attributes = { 5144 id: billing.id 5145 }; 5146 } else { 5147 billing_address_attributes = { 5148 address_one: billing.address, 5149 address_two: billing.address_2, 5150 city: billing.city, 5151 region_name: billing.state, 5152 country_id: billing.country, 5153 postal_code: billing.zip 5154 }; 5155 } 5156 } 5157 if (isSavedAddress(shipping)) { 5158 physical_address_attributes = { 5159 id: shipping.id 5160 }; 5161 } else { 5162 physical_address_attributes = { 5163 address_one: shipping.address, 5164 address_two: shipping.address_2, 5165 city: shipping.city, 5166 region_name: shipping.state, 5167 country_id: shipping.country, 5168 postal_code: shipping.zip 5169 }; 5170 } 5171 if (hasPhysicalProducts(checkoutCart)) { 5172 const billingSameAsShipping = globalThis.Checkout.store.billingSameAsShipping.get(); 5173 if (options.skipBillingAddress) { 5174 return { shipping: { shipping_addresses_attributes: [{ physical_address_attributes }] } }; 5175 } 5176 if (mode == globalThis.Checkout.CheckoutStates.OTO) { 5177 return { 5178 shipping: { shipping_addresses_attributes: [{ physical_address_attributes }] }, 5179 billing: { billing_address_attributes, billing_same_as_shipping: false } 5180 }; 5181 } 5182 if (billingSameAsShipping) { 5183 return { 5184 shipping: { shipping_addresses_attributes: [{ physical_address_attributes }] }, 5185 billing: { billing_same_as_shipping: true } 5186 }; 5187 } else { 5188 return { 5189 shipping: { shipping_addresses_attributes: [{ physical_address_attributes }] }, 5190 billing: { billing_address_attributes, billing_same_as_shipping: false } 5191 }; 5192 } 5193 } else { 5194 if (options.skipBillingAddress) return; 5195 return { billing: { billing_address_attributes } }; 5196 } 5197}; 5198submitOrderAsync_fn = async function(data, requestIdempotency, maxRetries = 3, onBeforeSubmit, onRetryAfter) { 5199 let response; 5200 for (let i = 0; i < maxRetries; i++) { 5201 onBeforeSubmit(); 5202 const nonce = await fetchCheckoutNonce(); 5203 response = await fetch(renderedHref(), { 5204 credentials: "same-origin", 5205 method: "post", 5206 body: JSON.stringify({ ...data, request_idempotency: requestIdempotency, ...checkoutNonceParams(nonce) }), 5207 headers: { 5208 "Content-Type": "application/json", 5209 "X-CF2-POST-TYPE": "submit" 5210 } 5211 }).then((res) => { 5212 if (res.status >= 500) { 5213 console.error(res); 5214 throw Error("500 error"); 5215 } 5216 return res; 5217 }); 5218 if (response.status === 429) { 5219 const sleepTime = parseInt(response.headers.get("Retry-After")); 5220 onRetryAfter(sleepTime); 5221 console.log(`Waiting on queue, retrying after ${sleepTime}`); 5222 await sleepMs(sleepTime); 5223 } else { 5224 break; 5225 } 5226 } 5227 return response; 5228}; 5229handleFormSubmitRedirect_fn = async function(response, urlToRedirect) { 5230 globalThis.location.href = urlToRedirect; 5231}; 5232add3dsListener_fn = function() { 5233 if (__privateGet(this, _threedsListenerEnabled)) return; 5234 __privateSet(this, _threedsListenerEnabled, true); 5235 globalThis.addEventListener("message", (event) => { 5236 if (event.data.sender == "CfOrderStatus") { 5237 const orderDetails = event.data.details; 5238 if (__privateGet(this, _redirecTo)) { 5239 orderDetails.redirect_to = __privateGet(this, _redirecTo); 5240 } 5241 fetch(renderedHref(), { 5242 credentials: "same-origin", 5243 method: "post", 5244 body: JSON.stringify(orderDetails), 5245 headers: { 5246 "Content-Type": "application/json", 5247 "X-CF2-POST-TYPE": "submit" 5248 } 5249 }).then((response) => { 5250 if (orderDetails["orderResult"] == "declined") { 5251 globalThis.Checkout.store.submitting.set({ 5252 state: globalThis.Checkout.SubmittingStates.ERROR, 5253 code: globalThis.Checkout.ErrorTypes.THREEDS_DECLINED_ERROR 5254 }); 5255 } else { 5256 if (response.ok) { 5257 globalThis.Checkout.store.state.set(globalThis.Checkout.StoreStates.SUBMITTED);
5258 globalThis.CFDispatchEvent(globalThis.CFEvents.FORM_SUBMITTED_FINALIZED, __privateGet(this, _formSubmitPayload)); 5259 __privateMethod(this, _CheckoutSubmit_static, handleFormSubmitRedirect_fn).call(this, response, response.headers.get("Location")); 5260 } else { 5261 response.json().then((r) => { 5262 globalThis.Checkout.store.submitting.set({ 5263 state: globalThis.Checkout.SubmittingStates.ERROR, 5264 code: globalThis.Checkout.ErrorTypes.THREEDS_DECLINED_CUSTOM_ERROR, 5265 message: r.error 5266 }); 5267 }); 5268 } 5269 } 5270 globalThis.Checkout.store.threeds.set({ 5271 show: false, 5272 approvalUrl: null 5273 }); 5274 }); 5275 } 5276 }); 5277}; 5278__privateAdd(CheckoutSubmit, _CheckoutSubmit_static); 5279__privateAdd(CheckoutSubmit, _redirecTo, document.querySelector('[href="#submit-checkout-form"]')?.getAttribute("data-on-submit-go-to")); 5280__privateAdd(CheckoutSubmit, _threedsListenerEnabled, false); 5281__privateAdd(CheckoutSubmit, _formSubmitPayload, null); 5282
5283// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-apple-pay-button-v1.ts 5284init_runtime(); 5285var CheckoutApplePayButtonV1 = class extends CF2Component { 5286 constructor(el, runtimeSel) { 5287 super(el, runtimeSel); 5288 } 5289 mount() { 5290 this.applePayMounted = nanostores.atom(false); 5291 const checkoutElement = this.element.closest(".elCheckout"); 5292 if (!!this.getApplePayPreview()) { 5293 this.getApplePayPreview().addEventListener("click", (evt) => { 5294 evt.preventDefault(); 5295 CheckoutSubmit.checkSubmitShowErrors({ onlyFields: /* @__PURE__ */ new Set(["products"]) }); 5296 CheckoutSubmit.checkSubmit(checkoutElement); 5297 }); 5298 new MutationObserver((mutations) => { 5299 for (const mutation of mutations) { 5300 for (const addedNode of mutation.addedNodes) { 5301 if (addedNode.id == "rebilly-apple-pay-button") { 5302 this.applePayMounted.set(true); 5303 } 5304 } 5305 for (const removedNode of mutation.removedNodes) { 5306 if (removedNode.id == "rebilly-apple-pay-button") { 5307 this.applePayMounted.set(false); 5308 } 5309 } 5310 } 5311 }).observe(this.element.querySelector(".apple-pay-button"), { 5312 subtree: true, 5313 childList: true 5314 }); 5315 const computedState = nanostores.computed([ 5316 Checkout.computed.isDigitalWalletReadyToStart, 5317 this.applePayMounted, 5318 Checkout.store.isUpdatingRebilly 5319 ], (isDigitalWalletReadyToStart, isMounted, isUpdatingRebilly) => { 5320 if (isUpdatingRebilly) { 5321 return "loading"; 5322 } else if (!isMounted || !isDigitalWalletReadyToStart) { 5323 return "preview"; 5324 } else { 5325 return "ready"; 5326 } 5327 }); 5328 computedState.subscribe((state) => { 5329 this.getApplePayWrapper() && (this.getApplePayWrapper().dataset.state = state); 5330 }); 5331 const computedShowApplePay = nanostores.computed([ 5332 Checkout.store.payment.id, 5333 Checkout.store.payment.type 5334 ], (paymentId, paymentType) => { 5335 return !paymentId && paymentType == "apple-pay" && this.mode != "upgradeDowngrade"; 5336 }); 5337 computedShowApplePay.subscribe((showApplePay) => { 5338 this.element.closest(".submit-button-wrapper")?.setAttribute("data-show-apple-pay", showApplePay); 5339 }); 5340 } 5341 } 5342 getApplePayWrapper() { 5343 return this.element.querySelector(".apple-pay-button-wrapper"); 5344 } 5345 getApplePayPreview() { 5346 return this.element.querySelector(".apple-pay-button-preview"); 5347 } 5348}; 5349registerComponent("CheckoutApplePayButton/V1", CheckoutApplePayButtonV1); 5350window["CheckoutApplePayButtonV1"] = CheckoutApplePayButtonV1; 5351
5352// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-submit-button-v1.ts 5353init_define_process(); 5354init_general(); 5355init_runtime(); 5356var CheckoutSubmitButtonV1 = class extends CF2Component { 5357 constructor(el, runtimeSel) { 5358 super(el, runtimeSel); 5359 } 5360 onSubmit(element) { 5361 } 5362 mount() { 5363 this.storeButtonInitialHTML(); 5364 this.getSubmitButton().addEventListener("click", (evt) => { 5365 evt.preventDefault(); 5366 this.requestSubmit(); 5367 }); 5368 const checkoutElement = this.element.closest(".elCheckout"); 5369 Checkout.store.state.listen((state) => { 5370 if (state === Checkout.StoreStates.INITIALIZED && !this.keydownListenerAttached) { 5371 this.keydownListenerAttached = true; 5372 document.addEventListener("keydown", (evt) => { 5373 if (evt.isComposing || evt.keyCode === 229) return; 5374 if (evt.keyCode === 13 && $(this.element).is(":visible")) { 5375 if (isElementVisibleOnViewport(checkoutElement, 20)) { 5376 this.element.focus(); 5377 this.requestSubmit(); 5378 } 5379 } 5380 }); 5381 } 5382 }); 5383 } 5384 // The single entry point for every submit trigger. The lock is taken 5385 // synchronously, before any await, so it covers the whole attempt -- the 5386 // validation, tokenization and nonce work that runs before the payment POST as 5387 // well as the POST itself. The Enter key comes through here too, since 5388 // `pointer-events: none` only stops pointer input. 5389 requestSubmit() { 5390 if (this.isSubmitLocked()) return; 5391 this.lockSubmit(); 5392 Promise.all(this.onSubmit(this.element) ?? []).finally(() => { 5393 if (!this.submitClaimed) this.unlockSubmit(); 5394 }); 5395 } 5396 isSubmitLocked() { 5397 return this.getSubmitButton().getAttribute("data-disabled") === "true"; 5398 } 5399 // aria-disabled rides along because the button is an anchor: `pointer-events: none` 5400 // takes it out of the pointer flow but says nothing to a screen reader. 5401 lockSubmit() { 5402 this.getSubmitButton().setAttribute("data-disabled", true); 5403 this.getSubmitButton().setAttribute("aria-disabled", true); 5404 } 5405 unlockSubmit() { 5406 this.getSubmitButton().setAttribute("data-disabled", false); 5407 this.getSubmitButton().removeAttribute("aria-disabled"); 5408 } 5409 // Locks the button on behalf of a gateway. Also covers submits that never 5410 // touched this button -- express/wallet payments, the OTO one-click flow -- 5411 // which would otherwise leave it live while a payment is running. 5412 claimSubmit() { 5413 this.submitClaimed = true; 5414 this.lockSubmit(); 5415 } 5416 getSubmitButton() { 5417 return this.element.querySelector('[href="#submit-checkout-form"]'); 5418 } 5419 storeButtonInitialHTML() { 5420 const buttonMainText = this.element.querySelector(".elButtonMain .elButtonMainText"); 5421 const buttonSubText = this.element.querySelector(".elButtonSub"); 5422 this.buttonMainTextInitialHTML = buttonMainText.innerHTML; 5423 this.buttonSubTextInitialHTML = buttonSubText.innerHTML; 5424 } 5425 // The gateways' "back to idle" call, and so also the only thing that releases 5426 // the submit lock. Callers must not use it to refresh the label while a submit 5427 // is in flight. 5428 setButtonInitialHTML() { 5429 this.submitClaimed = false; 5430 this.unlockSubmit(); 5431 this.element.removeAttribute("data-loading"); 5432 const buttonMain = this.element.querySelector(".elButtonMain"); 5433 const buttonSub = this.element.querySelector(".elButtonSub"); 5434 buttonMain.querySelector(".elButtonSpinner").style.removeProperty("display"); 5435 const buttonMainText = buttonMain.querySelector(".elButtonMainText"); 5436 buttonMainText.innerHTML = this.buttonMainTextInitialHTML; 5437 buttonSub.innerHTML = this.buttonSubTextInitialHTML; 5438 } 5439 setLoading() { 5440 this.element.setAttribute("data-loading", "true"); 5441 } 5442 setSubmittingText() { 5443 this.claimSubmit(); 5444 this.element.removeAttribute("data-loading"); 5445 const buttonMain = this.element.querySelector(".elButtonMain"); 5446 const buttonSub = this.element.querySelector(".elButtonSub"); 5447 buttonMain.querySelector(".elButtonSpinner").style.display = "inline-block"; 5448 const buttonMainText = buttonMain.querySelector(".elButtonMainText"); 5449 buttonMainText.innerHTML = this.submittingText; 5450 buttonSub.innerHTML = ""; 5451 } 5452 update({ text, subText }) { 5453 this.element.removeAttribute("data-loading"); 5454 const buttonMain = this.element.querySelector(".elButtonMain"); 5455 const buttonSub = this.element.querySelector(".elButtonSub"); 5456 const buttonMainText = buttonMain.querySelector(".elButtonMainText"); 5457 buttonMainText.textContent = text; 5458 buttonSub.textContent = subText; 5459 } 5460}; 5461registerComponent("CheckoutSubmitButton/V1", CheckoutSubmitButtonV1); 5462window["CheckoutSubmitButtonV1"] = CheckoutSubmitButtonV1; 5463
5464// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-configuration-error-v1.ts 5465init_define_process(); 5466init_runtime(); 5467var CheckoutConfigurationErrorV1 = class extends CF2Component { 5468 constructor(el, runtimeSel) { 5469 super(el, runtimeSel); 5470 __publicField(this, "errorMessageMapping", { 5471 [ERROR_CODES.EMPTY_PAYMENT_METHODS_ERROR]: `<a href="https://support.myclickfunnels.com/docs/getting-started-setting-up-payments-in-clickfunnels" target="_blank">${this.checkoutConfigurationErrorsTexts.emptyPaymentMethodsError}</a>`, 5472 [ERROR_CODES.EMPTY_PRODUCTS_ERROR]: this.checkoutConfigurationErrorsTexts.emptyProductsError, 5473 [ERROR_CODES.ORDER_RECURRING_INTERVAL_MISMATCH]: this.checkoutConfigurationErrorsTexts.orderRecurringIntervalMismatchError, 5474 [ERROR_CODES.MULTIPLE_CHECKOUT_PRESENT]: this.checkoutConfigurationErrorsTexts.multipleCheckoutPresentError 5475 }); 5476 } 5477 mount() { 5478 const prettifyErrorMessage = (error) => { 5479 if (this.errorMessageMapping[error.code]) return this.errorMessageMapping[error.code]; 5480 if (error.fetchErrorType == CFFetcherErrorTypes.NETWORK_ERROR) { 5481 return `${this.checkoutConfigurationErrorsTexts.networkError} ${error.code}`; 5482 } else { 5483 return `${this.checkoutConfigurationErrorsTexts.criticalServerError} ${error.code}`; 5484 } 5485 }; 5486 Checkout.store?.criticalErrors?.subscribe((errors) => { 5487 this.errors = errors.map(prettifyErrorMessage); 5488 this.render(); 5489 }); 5490 } 5491 setErrors(errors) { 5492 if (errors === null || typeof errors === "undefined") { 5493 return; 5494 } 5495 this.errors = Array.isArray(errors) ? errors : [errors]; 5496 this.render(); 5497 } 5498 remove() { 5499 this.element.innerHTML = ""; 5500 } 5501 render(initializeChildrenInstances = false) { 5502 const is_server = true; 5503 const errors = this.errors ?? []; 5504 const checkoutConfigurationErrorsTexts = this.checkoutConfigurationErrorsTexts ?? null; 5505 let html = ""; 5506 { 5507 html += `<div class="elCheckoutConfigError`; 5508 if (errors?.length == 0) { 5509 html += ` elHide`; 5510 } 5511 html += `">`; 5512 const c0 = errors; 5513 const fl1 = new CF2ForloopDrop(c0.length); 5514 for (const error of c0) { 5515 const forloop = fl1; 5516 html += `<span>${error}</span>`; 5517 forloop.next(); 5518 } 5519 html += `</div>`; 5520 } 5521 this.replaceContent(html); 5522 if (initializeChildrenInstances) { 5523 const scopeToYggRender = this.element.querySelectorAll("[ygg-render]").length > 0; 5524 const options = { scopeToYggRender }; 5525 CF2Component.hydrateTree(this.element, options); 5526 } 5527 } 5528}; 5529registerComponent("CheckoutConfigurationError/V1", CheckoutConfigurationErrorV1); 5530window["CheckoutConfigurationErrorV1"] = CheckoutConfigurationErrorV1; 5531
5532// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-order-details-content-v1.ts 5533init_define_process(); 5534init_runtime(); 5535var CheckoutOrderDetailsContentV1 = class extends CF2Component { 5536 constructor(el, runtimeSel) { 5537 super(el, runtimeSel); 5538 __publicField(this, "undefined"); 5539 } 5540 remove() { 5541 this.element.innerHTML = ""; 5542 } 5543 render(initializeChildrenInstances = false) { 5544 const is_server = true; 5545 const order_details = this.order_details ?? { "order_number": "#12345", "shipping_address": {}, "billing_address": {}, "billing_payment_method": { "id": 1, "details": "XXXX-XXXX-XXXX-1111", "type": "payment-card", "icon": "visa" }, "line_items": [{ "variant_id": 25, "product_id": 6508, "quantity": 1, "image": "/editor/editor-demo-image-placeholder.svg" }] }; 5546 let html = ""; 5547 { 5548 html += `<div class="elCheckoutOrderDetailsInfoWrapper"><div class="elCheckoutOrderDetailsInfo"><h2> ${order_details?.order_number}</h2><div class="elCheckoutOrderDetailsStatus" data-order-status="${order_details?.service_status}">${order_details?.service_status.charAt(0).toUpperCase() + order_details?.service_status.slice(1).toLowerCase()}</div></div>`; 5549 if (order_details?.name) { 5550 html += `<span class="elCheckoutOrderDetailsName">${order_details?.name}</span>`; 5551 } 5552 html += `<span class="elCheckoutOrderDetailsDate">${order_details?.created_at}</span></div><div class="elCheckoutOrderDetailsItemsWrapper elCheckoutOrderDetailsWrapper"><h3></h3><div class="elCheckoutOrderDetailsItems elCheckoutOrderDetailsContainer">`; 5553 const c0 = order_details.line_items; 5554 const fl1 = new CF2ForloopDrop(c0.length); 5555 for (const line_item of c0) { 5556 const forloop = fl1; 5557 html += `<div class="elCheckoutOrderDetailsItem">`; 5558 const imageUrl = line_item?.image; 5559 if (imageUrl) { 5560 html += `<div class="elCheckoutOrderDetailsItemImage"><div data-page-element="Image/V2" class="elImageWrapper de-image-block id-Image/V2`; 5561 if (CF2Blank(imageUrl) && CF2Blank(null) && true) { 5562 html += ` forceHide`; 5563 } 5564 html += `" data-liquid-replace="item">`; 5565 if (imageUrl || !CF2Blank(null)) { 5566 html += `<img class="elImage" src="${imageUrl ?? null}" data-lazy-loading="true" data-lazy-loading="true"/>`; 5567 } else if (false) { 5568 html += `<div class="image-placeholder" title=""><span class="image-placeholder-header"></span></div>`; 5569 } 5570 html += `</div><div class="elCheckoutOrderDetailsItemQty">${line_item?.quantity}</div></div>`; 5571 } 5572 html += `<div class="elCheckoutOrderDetailsItemInfo"><span class="elCheckoutOrderDetailsItemName">${line_item?.product_name}</span>`; 5573 if (line_item?.display_price) { 5574 html += `<span class="elCheckoutOrderDetailsItemPrice">${line_item?.display_price}</span>`; 5575 } 5576 if (line_item?.variant_properties_values?.length > 0) { 5577 html += `<div class="elCheckoutOrderDetailsVariants">`; 5578 const c2 = line_item.variant_properties_values; 5579 const fl3 = new CF2ForloopDrop(c2.length); 5580 for (const variant_item of c2) { 5581 const forloop2 = fl3; 5582 html += `<span>${variant_item?.value}</span>`; 5583 forloop2.next(); 5584 } 5585 html += `</div>`; 5586 } 5587 html += `</div><div class="elCheckoutOrderDetailsItemAmount"><span>${line_item?.amount}</span></div></div>`; 5588 forloop.next(); 5589 } 5590 html += `</div></div>`; 5591 if (order_details?.shipping_address) { 5592 html += `<div class="elCheckoutOrderDetailsShipping elCheckoutOrderDetailsWrapper"><h3></h3><div class="elCheckoutOrderDetailsContainer"><i class="fas fa-map-marker-alt"></i><span>${order_details?.shipping_address}</span></div></div>`; 5593 } 5594 if (order_details?.billing_address) { 5595 html += `<div class="elCheckoutOrderDetailsBilling elCheckoutOrderDetailsWrapper"><h3></h3><div class="elCheckoutOrderDetailsContainer"><i class="far fa-credit-card"></i><span>${order_details?.billing_address}</span></div></div>`; 5596 } 5597 if (order_details?.billing_payment_method) { 5598 html += `<div class="elCheckoutOrderDetailsPayment elCheckoutOrderDetailsWrapper"><h3></h3>`; 5599 if (order_details?.billing_payment_method?.type == "payment-card") { 5600 html += `<div class="elCheckoutOrderDetailsPaymentType"><div class="elCheckoutOrderDetailsContainer"><i class="fab fa-cc-${order_details?.billing_payment_method?.icon}"></i><span>${order_details?.billing_payment_method?.details}</span></div></div>`; 5601 } else if (order_details?.billing_payment_method?.type == "paypal") { 5602 html += `<div class="elCheckoutOrderDetailsPaymentType"><div class="elCheckoutOrderDetailsContainer"><i class="fab fa-paypal"></i><span>${order_details?.billing_payment_method?.details}</span></div></div>`; 5603 } 5604 html += `</div>`; 5605 } 5606 html += `<div class="elCheckoutOrderDetailsSummaryWrapper elCheckoutOrderDetailsWrapper"><h3></h3>
5606<div class="elCheckoutOrderDetailsSummary elCheckoutOrderDetailsContainer">`; 5607 if (order_details?.tax_amount) { 5608 html += `<div class="elCheckoutOrderDetailsSummaryTax"><span></span><span>${order_details?.tax_amount}</span></div>`; 5609 } 5610 if (order_details?.shipping_amount) { 5611 html += `<div class="elCheckoutOrderDetailsSummaryShipping"><span></span><span>${order_details?.shipping_amount}</span></div>`; 5612 } 5613 html += `<div class="elCheckoutOrderDetailsSummaryTotal"><span></span><span>${order_details?.total_amount}</span></div></div></div>`; 5614 } 5615 this.replaceContent(html); 5616 if (initializeChildrenInstances) { 5617 const scopeToYggRender = this.element.querySelectorAll("[ygg-render]").length > 0; 5618 const options = { scopeToYggRender }; 5619 CF2Component.hydrateTree(this.element, options); 5620 } 5621 } 5622}; 5623registerComponent("CheckoutOrderDetailsContent/V1", CheckoutOrderDetailsContentV1); 5624window["CheckoutOrderDetailsContentV1"] = CheckoutOrderDetailsContentV1; 5625
5626// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-order-details-v1.ts 5627init_define_process(); 5628init_modal_v1(); 5629
5630// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-existing-orders.ts 5631init_define_process(); 5632
5633// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Utils/api.ts 5634init_define_process(); 5635init_fetcher(); 5636function makeCurrentPageFetcher(options) { 5637 const { headers, ...requestOptions } = options ?? {}; 5638 const fetcher = new Fetcher({ 5639 debug: true, 5640 pathPrefix: window.location.origin + renderedPath(), 5641 headers: { 5642 Accept: "application/json", 5643 "Content-Type": "application/json", 5644 ...headers ?? {} 5645 }, 5646 requestOptions: { 5647 retries: 3, 5648 timeoutMS: 3e4, 5649 timeoutAfterRetrial: 1e3, 5650 convertThrowToErrorResponse: true, 5651 onlyOneInflightRequest: true, 5652 ...requestOptions 5653 } 5654 }); 5655 return fetcher; 5656} 5657
5658// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-existing-orders.ts 5659var REACTAVATABLE_SERVICE_STATUS = ["canceled", "churned"]; 5660var existingOrderFetcher = makeCurrentPageFetcher({ 5661 customEvent: "CF2:ExistingOrder", 5662 shouldCaptureServerError: true, 5663 convertThrowToErrorResponse: false 5664}); 5665var _hasReactivatableItems, _hasUpgradeDowngradeItems, _productCardDetails, _productCardDetailsObj; 5666var CheckoutExistingOrders = class { 5667 static fetch(payload = {}) { 5668 if (globalThis.globalResourceData.resourceName == "checkout") return Promise.resolve(); 5669 const manage_order_id = new URLSearchParams(window.location.search).get("manage_order_id"); 5670 return existingOrderFetcher.get("/existing_orders", { manage_order_id, ...payload }).then((data) => { 5671 this.cleanUp(); 5672 this.processExistingOrdersResponse(data); 5673 }).catch((e) => { 5674 throw new CheckoutCriticalError(ERROR_CODES.FETCH_EXISTING_ORDERS_ERROR, { 5675 cause: e 5676 }); 5677 }); 5678 } 5679 static cleanUp() { 5680 __privateSet(this, _hasReactivatableItems, false); 5681 __privateSet(this, _hasUpgradeDowngradeItems, false); 5682 this.orderDetailsByOrderId = {}; 5683 __privateSet(this, _productCardDetails, {}); 5684 __privateSet(this, _productCardDetailsObj, {}); 5685 } 5686 static clearUpdatableOrders(selectedProductId) { 5687 if (anyUpdatableOrders()) { 5688 globalThis.globalResourceData.products?.forEach(({ id: productId }) => { 5689 const isSelected = selectedProductId == productId; 5690 updateCardByProductIdState(productId, { 5691 quantity: isSelected ? 1 : 0, 5692 renderType: void 0, 5693 selectedOrderIndex: void 0, 5694 selectedUpdatableCartItemIndex: void 0, 5695 updatableOrders: void 0, 5696 cartItemOrderId: void 0, 5697 cartItemLineItemId: void 0, 5698 cartItemRenderType: void 0 5699 }); 5700 }); 5701 this.cleanUp(); 5702 } 5703 } 5704 static processExistingOrdersResponse(existingOrdersResponse) { 5705 existingOrdersResponse.orders.forEach((order) => { 5706 const orderId = order.id; 5707 this.orderDetailsByOrderId[orderId] = order; 5708 const orderNumber = order.order_number; 5709 order.line_items.forEach((lineItem) => { 5710 const productId = lineItem.product_id; 5711 const lineItemSubscriptionDetails = lineItem.subscription_details; 5712 if (REACTAVATABLE_SERVICE_STATUS.includes(lineItemSubscriptionDetails?.status) && lineItemSubscriptionDetails?.reactivatable) { 5713 this.processReactivation(lineItem, orderId, orderNumber, productId); 5714 } else { 5715 this.processUpgradeDowngrades(lineItem, orderId, orderNumber, productId); 5716 } 5717 }); 5718 }); 5719 if (__privateGet(this, _hasReactivatableItems) || __privateGet(this, _hasUpgradeDowngradeItems)) { 5720 this.processUpdatableObj(); 5721 this.updateSelectedCardItem(); 5722 } 5723 } 5724 static processUpdatableObj() { 5725 __privateSet(this, _productCardDetails, {}); 5726 Object.keys(__privateGet(this, _productCardDetailsObj)).forEach((k) => { 5727 __privateGet(this, _productCardDetails)[k] = { 5728 updatableOrders: Object.values(__privateGet(this, _productCardDetailsObj)[k].updatableOrders).reverse() 5729 }; 5730 }); 5731 } 5732 static processReactivation(lineItem, orderId, orderNumber, productId) { 5733 const lineItemId = lineItem.id; 5734 const variantId = lineItem.variant_id; 5735 const priceId = lineItem.price_id; 5736 if (!globalThis.Checkout.variantsById[variantId] || !globalThis.Checkout.pricesById[priceId]) { 5737 return; 5738 } 5739 __privateSet(this, _hasReactivatableItems, true); 5740 this.storeProductCardDetails( 5741 globalThis.Checkout.CheckoutStates.REACTIVATE, 5742 orderId, 5743 orderNumber, 5744 lineItemId, 5745 productId, 5746 variantId, 5747 priceId 5748 ); 5749 } 5750 static processUpgradeDowngrades(lineItem, orderId, orderNumber, productId) { 5751 const lineItemId = lineItem.id; 5752 lineItem.upgrade_downgrade_options.forEach((upgradeDowngrade) => { 5753 const variantId = upgradeDowngrade.variant_to_id; 5754 const priceId = upgradeDowngrade.price_to_id; 5755 if (!globalThis.Checkout.variantsById[variantId] || !globalThis.Checkout.pricesById[priceId]) { 5756 return; 5757 } 5758 __privateSet(this, _hasUpgradeDowngradeItems, true);
5759 this.storeProductCardDetails( 5760 globalThis.Checkout.CheckoutStates.UPGRADE_DOWNGRADE, 5761 orderId, 5762 orderNumber, 5763 lineItemId, 5764 productId, 5765 variantId, 5766 priceId, 5767 upgradeDowngrade.direction 5768 ); 5769 }); 5770 } 5771 static storeProductCardDetails(type, orderId, orderNumber, lineItemId, productId, variantId, priceId, direction) { 5772 __privateGet(this, _productCardDetailsObj)[productId] = __privateGet(this, _productCardDetailsObj)[productId] ?? { 5773 updatableOrders: {} 5774 }; 5775 const updatableOrders = __privateGet(this, _productCardDetailsObj)[productId].updatableOrders; 5776 updatableOrders[orderId] = updatableOrders[orderId] ?? { 5777 type, 5778 id: orderId, 5779 number: orderNumber, 5780 updatableItems: [] 5781 }; 5782 const { name: variantName } = globalThis.Checkout.variantsById[variantId]; 5783 const { name: priceName } = globalThis.Checkout.pricesById[priceId]; 5784 const updatableItems = updatableOrders[orderId].updatableItems; 5785 updatableItems.push({ 5786 variantName, 5787 priceName, 5788 direction: direction ? direction?.charAt(0).toUpperCase() + direction?.slice(1) : null, 5789 cardDetails: { 5790 variantId, 5791 priceId, 5792 // NOTE: We disable orderId and lineItemId for reactivations until we can perform reactivations 5793 // on the same order as currently we create a new order when that happens 5794 ...type == globalThis.Checkout.CheckoutStates.UPGRADE_DOWNGRADE ? { 5795 orderId, 5796 lineItemId 5797 } : {} 5798 } 5799 }); 5800 } 5801 static updateSelectedCardItem() { 5802 let selectedCartItemDetail; 5803 globalThis.Checkout.computed.checkoutCart.get().items.find(({ product_id, variant_id, price_id }) => { 5804 const cardDetails = __privateGet(this, _productCardDetails)[product_id]?.updatableOrders[0].updatableItems[0].cardDetails; 5805 if (!globalThis.Checkout.productsById[product_id].bump && __privateGet(this, _productCardDetails)[product_id]) { 5806 selectedCartItemDetail = {}; 5807 selectedCartItemDetail.variantId = cardDetails?.variantId ?? variant_id; 5808 selectedCartItemDetail.priceId = cardDetails?.priceId ?? price_id; 5809 selectedCartItemDetail.productId = product_id; 5810 return true; 5811 } 5812 }); 5813 if (!selectedCartItemDetail) { 5814 selectedCartItemDetail = {}; 5815 const product = globalThis.Checkout.products.filter((p) => !p.bump)[0]; 5816 const cardDetails = __privateGet(this, _productCardDetails)[product.id]?.updatableOrders[0].updatableItems[0].cardDetails; 5817 const variant = product.variants[0]; 5818 const price = variant.prices[0]; 5819 selectedCartItemDetail.variantId = cardDetails?.variantId ?? Number(variant.id); 5820 selectedCartItemDetail.priceId = cardDetails?.priceId ?? Number(price.id); 5821 selectedCartItemDetail.productId = product.id; 5822 } 5823 globalThis.globalResourceData.products?.forEach(({ id: productId }) => { 5824 const hasUpdatablePccState = !!__privateGet(this, _productCardDetails)[productId]; 5825 if (hasUpdatablePccState) { 5826 const order = __privateGet(this, _productCardDetails)[productId].updatableOrders[0]; 5827 const cartItem = order.updatableItems[0].cardDetails; 5828 const updatablePccState = __privateGet(this, _productCardDetails)[productId] ?? {}; 5829 updatablePccState.selectedOrderIndex = 0; 5830 updatablePccState.selectedUpdatableCartItemIndex = 0; 5831 updatablePccState.cartItemOrderId = cartItem.orderId; 5832 updatablePccState.cartItemLineItemId = cartItem.lineItemId; 5833 updatablePccState.cartItemRenderType = updatablePccState.renderType = order.type; 5834 updatablePccState.variantId = cartItem.variantId; 5835 updatablePccState.priceId = cartItem.priceId; 5836 const isProductInCart = selectedCartItemDetail.productId == productId; 5837 if (isProductInCart) { 5838 updatablePccState.variantId = selectedCartItemDetail.variantId; 5839 updatablePccState.priceId = selectedCartItemDetail.priceId; 5840 updatablePccState.quantity = 1; 5841 } 5842 const compositeKeys = getCompositeKeysForProduct(String(productId)); 5843 updateCardByProductIdState(productId, { 5844 ...updatablePccState, 5845 ...compositeKeys.length > 0 ? { quantity: 0 } : {} 5846 }); 5847 for (const compositeKey of compositeKeys) { 5848 const variantId = compositeKey.split(":")[1]; 5849 const matchingItem = order.updatableItems.find((item) =>
5849 String(item.cardDetails.variantId) == variantId); 5850 if (matchingItem) { 5851 updateCardByProductIdState(compositeKey, { 5852 updatableOrders: updatablePccState.updatableOrders, 5853 renderType: order.type, 5854 individualDirection: matchingItem.direction, 5855 selectedOrderIndex: 0, 5856 selectedUpdatableCartItemIndex: 0, 5857 cartItemRenderType: order.type, 5858 cartItemOrderId: matchingItem.cardDetails.orderId, 5859 cartItemLineItemId: matchingItem.cardDetails.lineItemId, 5860 variantId: matchingItem.cardDetails.variantId, 5861 priceId: matchingItem.cardDetails.priceId, 5862 quantity: isProductInCart && String(selectedCartItemDetail.variantId) == variantId ? 1 : 0 5863 }); 5864 } else { 5865 const fullOrder = this.orderDetailsByOrderId[order.id]; 5866 const isCurrentVariant = fullOrder?.line_items?.some( 5867 (li) => String(li.variant_id) == variantId && String(li.product_id) == String(productId) 5868 ); 5869 if (isCurrentVariant) { 5870 updateCardByProductIdState(compositeKey, { 5871 updatableOrders: updatablePccState.updatableOrders, 5872 renderType: order.type, 5873 individualDirection: "current", 5874 selectedOrderIndex: -1, 5875 cartItemRenderType: void 0, 5876 cartItemOrderId: void 0, 5877 cartItemLineItemId: void 0 5878 }); 5879 } 5880 } 5881 } 5882 } else { 5883 updateCardByProductIdState(productId, { selectType: "single" }); 5884 } 5885 }); 5886 } 5887}; 5888_hasReactivatableItems = new WeakMap(); 5889_hasUpgradeDowngradeItems = new WeakMap(); 5890_productCardDetails = new WeakMap(); 5891_productCardDetailsObj = new WeakMap(); 5892__privateAdd(CheckoutExistingOrders, _hasReactivatableItems, false); 5893__privateAdd(CheckoutExistingOrders, _hasUpgradeDowngradeItems, false); 5894__privateAdd(CheckoutExistingOrders, _productCardDetails, {}); 5895__privateAdd(CheckoutExistingOrders, _productCardDetailsObj, {}); 5896__publicField(CheckoutExistingOrders, "orderDetailsByOrderId", {}); 5897
5898// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-order-details-v1.ts 5899init_runtime(); 5900var CheckoutOrderDetailsV1 = class extends CF2Component { 5901 constructor(el, runtimeSel) { 5902 super(el, runtimeSel); 5903 } 5904 mount() { 5905 this.getCloseButton().addEventListener("click", (evt) => { 5906 evt.preventDefault(); 5907 Checkout.store.selectedOrderDetailId.set(null); 5908 }); 5909 this.getModal().onClose = () => { 5910 Checkout.store.selectedOrderDetailId.set(null); 5911 }; 5912 Checkout.store.selectedOrderDetailId.listen((selectedOrderDetailId) => { 5913 if (selectedOrderDetailId) { 5914 this.showModal(); 5915 this.getContent().order_details = CheckoutExistingOrders.orderDetailsByOrderId[selectedOrderDetailId]; 5916 const orderDetails = this.getContent().order_details; 5917 this.formatOrderDetails(orderDetails); 5918 this.getContent().render(); 5919 } else { 5920 this.hideModal(); 5921 } 5922 }); 5923 } 5924 addressToString(address) { 5925 let str = ""; 5926 if (address.street_one) { 5927 str = address.street_one; 5928 if (address.street_two) { 5929 str += `, ${address.street_two}`; 5930 } 5931 if (address.city) { 5932 str += `. ${address.city}`; 5933 } 5934 if (address.region) { 5935 str += `, ${address.region}`; 5936 } 5937 if (address.postal_code) { 5938 str += ` ${address.postal_code}`; 5939 } 5940 if (address.country) { 5941 str += `, ${address.country}`; 5942 } 5943 } else { 5944 if (address.postal_code) { 5945 str += `${address.postal_code}, `; 5946 } 5947 if (address.country) { 5948 str += `${address.country}`; 5949 } 5950 } 5951 return str; 5952 } 5953 formatOrderDetails(orderDetails) { 5954 orderDetails.created_at = new Date(orderDetails.created_at_epoch * 1e3).toLocaleString(navigator.language); 5955 if (orderDetails.shipping_address) { 5956 orderDetails.shipping_address = this.addressToString(orderDetails.shipping_address); 5957 } 5958 if (orderDetails.billing_address) { 5959 orderDetails.billing_address = this.addressToString(orderDetails.billing_address); 5960 } 5961 if (orderDetails.line_items.length) { 5962 this.findAndAddProductsImage(orderDetails.line_items); 5963 } 5964 } 5965 getContent() { 5966 return this.getComponent("CheckoutOrderDetailsContent/V1"); 5967 } 5968 getModal() { 5969 return this.getComponent("Modal/V1"); 5970 } 5971 getCloseButton() { 5972 return this.getModal().element.querySelector(".elCheckoutModalFormClose"); 5973 } 5974 showModal() { 5975 this.getModal().element.style.display = "flex"; 5976 } 5977 hideModal() { 5978 this.getModal().element.style.display = "none"; 5979 } 5980 findAndAddProductsImage(lineItems) { 5981 lineItems.forEach((lineItem) => { 5982 lineItem.image = Checkout.variantsById[lineItem.variant_id].image ?? Checkout.productsById[lineItem.product_id].image; 5983 }); 5984 } 5985}; 5986registerComponent("CheckoutOrderDetails/V1", CheckoutOrderDetailsV1); 5987window["CheckoutOrderDetailsV1"] = CheckoutOrderDetailsV1; 5988 5989export { 5990 CheckoutTosV1, 5991 CheckoutMultiStepV2, 5992 hasPhysicalProducts, 5993 setupOrderSummaries, 5994 scrollToFirstVisibleError, 5995 checkValidCustomFields, 5996 buildCustomFields, 5997 collectLeads, 5998 AVAILABLE_KLARNA_COUNTRIES, 5999 numberOfStepsInCheckout, 6000 updateCardByProductIdState, 6001 unselectAllProducts, 6002 initIndividualVariantState, 6003 buildProductSelectBatched, 6004 CheckoutShippingProfileSelectV1, 6005 CheckoutLoadingV1, 6006 CheckoutSubmitNotificationV1, 6007 renderedHref, 6008 backfillAddressesId, 6009 isSavedAddress, 6010 fieldsForCountry, 6011 addressToString, 6012 parseAddressByFields, 6013 CheckoutCriticalError, 6014 ERROR_CODES, 6015 displayAndLogCriticalError, 6016 PaypalStates, 6017 ErrorTypes, 6018 hasUpgradeDowngradeItems, 6019 getStripeMode, 6020 getCartEstimatedTotal, 6021 convertToStripeAddress, 6022 convertAddressFromStripe, 6023 convertAddressFromSession, 6024 calculateStripeLineItems, 6025 STRIPE_SKIP_SHIPPING_ID, 6026 calculateStripeChangeResolveDetails, 6027 parseCssVars, 6028 hasErrors, 6029 productErrors, 6030 shippingOptionErrors, 6031 tosErrors, 6032 addressErrors, 6033 contactErrors, 6034 encodeVirtualInstallmentId, 6035 decodeVirtualInstallmentId, 6036 create, 6037 buildComputed, 6038 initializeUtilities, 6039 CheckoutSubmit, 6040 CheckoutSubmitButtonV1, 6041 CheckoutConfigurationErrorV1, 6042 makeCurrentPageFetcher, 6043 CheckoutExistingOrders 6044}; 6045//# sourceMappingURL=chunk-UBHLFMSE.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.