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-YSVSPNWW.js"; 15import { 16 getSelectedVariant, 17 init_addToCart 18} from "./chunk-372FPXG6.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").textContent = 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").textContent = 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").textContent = 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-error-classification.ts 3754init_define_process(); 3755function isServerCheckoutErrorEnvelope(payload) { 3756 return typeof payload?.error === "string" || payload?.error_details != null; 3757} 3758function normalizeServerCheckoutError(body) { 3759 const payload = body ?? {}; 3760 const raw = payload.error_details; 3761 const details = Array.isArray(raw) ? raw : raw ? [{ source: "payment_gateway", ...raw }] : []; 3762 return { 3763 code: details[0]?.code, 3764 // `?? message` makes this a fixpoint: normalising an already-normalised object must not lose 3765 // the text, or a second defensive pass would strip the decline that mounts the card field. 3766 message: payload.error ?? payload.message, 3767 error_details: isServerCheckoutErrorEnvelope(payload) ? details : void 0 3768 }; 3769} 3770function serverCheckoutErrorMessage(body) { 3771 if (!body || typeof body !== "object") return null; 3772 const payload = body; 3773 if (!isServerCheckoutErrorEnvelope(payload)) return null; 3774 const details = normalizeServerCheckoutError(payload).error_details ?? []; 3775 if (details.length) { 3776 const joined = details.map((detail) => detail?.graceful_message ?? detail?.message).filter(Boolean).join(" "); 3777 if (joined) return joined; 3778 } 3779 return payload.error || payload.message || null; 3780} 3781function isActionableCheckoutError(body) { 3782 const payload = body; 3783 const details = normalizeServerCheckoutError(payload).error_details ?? []; 3784 if (details.some((detail) => detail?.source === "payment_gateway")) { 3785 return true; 3786 } 3787 return !isServerCheckoutErrorEnvelope(payload); 3788} 3789
3790// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-store.ts 3791init_define_process(); 3792
3793// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-critical-errors.ts 3794init_define_process(); 3795init_error_with_cause(); 3796init_fetcher(); 3797var CheckoutCriticalError = class extends CFErrorWithCause { 3798 constructor(message, options) { 3799 super(message, options); 3800 __publicField(this, "name"); 3801 __publicField(this, "context"); 3802 this.name = "CheckoutCriticalError"; 3803 } 3804}; 3805var ERROR_CODES = { 3806 EMPTY_PRODUCTS_ERROR: "EMPTY_PRODUCTS_ERROR", 3807 EMPTY_PAYMENT_METHODS_ERROR: "EMPTY_PAYMENT_METHODS_ERROR", 3808 UNEXPECTED_INITIALIZATION_ERROR: "UNEXPECTED_INITIALIZATION_ERROR", 3809 FETCH_FEATURE_FLAGS_ERROR: "FETCH_FEATURE_FLAGS_ERROR", 3810 FETCH_COUNTRIES_STATES_ERROR: "FETCH_COUNTRIES_STATES_ERROR", 3811 FETCH_STRIPE_ADDRESS_FIELD_COUNTRIES_ERROR: "FETCH_STRIPE_ADDRESS_FIELD_COUNTRIES_ERROR", 3812 PAI_INITIALIZATION_SCRIPT_ERROR: "PAI_INITIALIZATION_SCRIPT_ERROR", 3813 PAI_INITIALIZATION_TIMEOUT_ERROR: "PAI_INITIALIZATION_TIMEOUT_ERROR", 3814 PAI_INITIALIZATION_READY_TIMEOUT_ERROR: "PAI_INITIALIZATION_READY_TIMEOUT_ERROR", 3815 PAI_INITIALIZATION_CONFIG_ERROR: "PAI_INITIALIZATION_CONFIG_ERROR", 3816 READY_TO_PAY_UPDATE_ERROR: "READY_TO_PAY_UPDATE_ERROR", 3817 FETCH_EXISTING_ORDERS_ERROR: "FETCH_EXISTING_ORDERS_ERROR", 3818 FETCH_PHONE_UTILS_ERROR: "FETCH_PHONE_UTILS_ERROR", 3819 ORDER_RECURRING_INTERVAL_MISMATCH: "ORDER_RECURRING_INTERVAL_MISMATCH", 3820 ERROR_PROCESSING_STRIPE_PAYMENT: "ERROR_PROCESSING_STRIPE_PAYMENT", 3821 ERROR_STRIPE_3DS_DECLINED: "ERROR_STRIPE_3DS_DECLINED", 3822 ERROR_STRIPE_CARD_DECLINED: "ERROR_STRIPE_CARD_DECLINED", 3823 MULTIPLE_CHECKOUT_PRESENT: "MULTIPLE_CHECKOUT_PRESENT" 3824}; 3825var displayAndLogCriticalError = (checkoutCriticalError, extraContext) => { 3826 const criticalErrors = globalThis.Checkout.store.criticalErrors.get(); 3827 const originalError = checkoutCriticalError.cause; 3828 if (originalError instanceof CFFetcherError) { 3829 const fetchError = originalError; 3830 globalThis.Checkout.store.criticalErrors.set([ 3831 ...criticalErrors, 3832 { code: checkoutCriticalError.message, fetchErrorType: fetchError.type } 3833 ]); 3834 } else { 3835 globalThis.Checkout.store.criticalErrors.set([...criticalErrors, { code: checkoutCriticalError.message }]); 3836 } 3837 console.error(CFstackWithCauses(checkoutCriticalError)); 3838 const context = { ...checkoutCriticalError.context ?? {}, ...extraContext ?? {} }; 3839 if (Object.keys(context).length > 0) { 3840 globalThis.Honeybadger?.notify(checkoutCriticalError, { context }); 3841 } else { 3842 globalThis.Honeybadger?.notify(checkoutCriticalError); 3843 } 3844}; 3845
3846// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-store.ts 3847init_nanostores(); 3848
3849// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-payment-types.ts 3850init_define_process(); 3851var STORE_PAYMENT_TYPES = ["payment-card", "paypal", "apple-pay", "Klarna"]; 3852var SPLITIT = "splitit"; 3853var toStoreType = (type) => type === SPLITIT ? "payment-card" : type; 3854var hasStoreBucket = (type) => STORE_PAYMENT_TYPES.includes(type); 3855var resolveInitialPaymentType = (savedPaymentType, enabledPayments) => { 3856 const collectable = (enabledPayments ?? []).map(toStoreType).filter(hasStoreBucket); 3857 const saved = toStoreType(savedPaymentType); 3858 if (collectable.length) return collectable.find((type) => type === saved) ?? collectable[0]; 3859 return hasStoreBucket(saved) ? saved : "payment-card"; 3860}; 3861
3862// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/RebillyCheckout/checkout-globals.ts 3863init_define_process(); 3864
3865// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-data-loader.ts 3866init_define_process(); 3867init_general(); 3868var getSSRGlobalResourceData = () => { 3869 const productSelectType = globalThis.globalResourceData.product_quantity_type ?? "single"; 3870 const { checkout_v2_state, contact } = globalThis?.sessionData ?? {}; 3871 const initialContactData = checkout_v2_state === "guest" ? {} : cleanEmptyObjectKeys({ 3872 first_name: contact?.first_name ?? "", 3873 last_name: contact?.last_name ?? "", 3874 email: contact?.email ?? "", 3875 phone_number: contact?.phone_number ?? "" 3876 }); 3877 const { products, productsById, variantsById, pricesById } = globalThis.globalResourceData; 3878 const savedPaymentMethods = contact?.payment_methods ?? []; 3879 return { 3880 productSelectType, 3881 products, 3882 productsById, 3883 variantsById, 3884 pricesById, 3885 savedPaymentMethods, 3886 initialContactData 3887 }; 3888}; 3889
3890// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-states.ts 3891init_define_process(); 3892var PaypalStates = { 3893 IDLE: "idle", 3894 INITIALIZED: "initialized", 3895 ERROR: "error", 3896 ADDING_PAYMENT_METHOD: "adding-payment-method", 3897 PAYMENT_METHOD_APPROVED: "payment-method-approved" 3898}; 3899var ErrorTypes = { 3900 REBILLY_ERROR: "rebilly-error", 3901 SERVER_ERROR: "server-error", 3902 UNHANDLED_SERVER_RESPONSE: "unhandled-server-response", 3903 THREEDS_DECLINED_ERROR: "3ds-declined-error", 3904 THREEDS_DECLINED_CUSTOM_ERROR: "3ds-declined-custom-error", 3905 PAYPAL_DECLINED_ERROR: "paypal-declined-error", 3906 PAYPAL_CUSTOM_ERROR: "paypal-custom-error" 3907}; 3908
3909// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/StripeCheckout/utils.ts 3910init_define_process(); 3911function hasRecurringPrice(cart) { 3912 return cart.items.some(({ price_id }) => { 3913 const price = globalThis.globalResourceData.pricesById[price_id]; 3914 return price.is_recurring; 3915 }); 3916} 3917function hasPhysicalProductsWithParams(cart) { 3918 return cart.items.some(({ product_id, variant_id }) => { 3919 const product = globalThis.Checkout.productsById[product_id]; 3920 const variant = globalThis.Checkout.variantsById[variant_id]; 3921 let productType = variant?.product_type; 3922 productType = productType || product?.product_type; 3923 return productType == "physical"; 3924 }); 3925} 3926function hasUpgradeDowngradeItems(cart) { 3927 return cart.items.some((item) => item.type === "upgradeDowngrade"); 3928} 3929function getStripeMode(cart, amount) { 3930 if (amount == 0) return "setup"; 3931 return hasRecurringPrice(cart) ? "subscription" : "payment"; 3932} 3933function getCartEstimatedTotal(cart) { 3934 const estimatedAmount = cart.items.reduce((acc, { price_id }) => { 3935 const price = globalThis.globalResourceData.pricesById[price_id]; 3936 return acc + price.initial_price_cents; 3937 }, 0); 3938 return estimatedAmount; 3939} 3940function convertToStripeAddress(address) { 3941 return { 3942 line1: address.address_one, 3943 line2: address.address_two, 3944 city: address.city, 3945 state: address.state, 3946 postal_code: address.postal_code, 3947 country: address.country 3948 }; 3949} 3950function convertAddressFromStripe(address) { 3951 return { 3952 address_one: address.line1, 3953 address_two: address.line2, 3954 city: address.city, 3955 state: address.state, 3956 country: address.country, 3957 postal_code: address.postal_code 3958 }; 3959} 3960function convertAddressFromSession(address) { 3961 return { 3962 address_one: address.address, 3963 address_two: address.address_2, 3964 city: address.city, 3965 state: address.state, 3966 country: address.country, 3967 postal_code: address.zip 3968 }; 3969} 3970function calculateStripeLineItems(lineItems, shippingOption, taxAmount, discountAmount) { 3971 const allLineItems = lineItems.map(({ priceCents, description }) => { 3972 return { 3973 name: description, 3974 amount: priceCents 3975 }; 3976 }); 3977 if (shippingOption) { 3978 allLineItems.push({ 3979 name: shippingOption.description, 3980 amount: shippingOption.amount_cents 3981 }); 3982 } 3983 if (taxAmount) { 3984 allLineItems.push({ 3985 name: "Taxes", 3986 amount: taxAmount 3987 }); 3988 } 3989 if (discountAmount) { 3990 allLineItems.push({ 3991 name: "Discount", 3992 amount: -discountAmount 3993 }); 3994 } 3995 return allLineItems; 3996} 3997var STRIPE_SKIP_SHIPPING_ID = "skip it"; 3998function calculateStripeChangeResolveDetails(lineItems, quotesResponse, shippingOption, taxAmount, discountAmount) { 3999 return { 4000 lineItems: calculateStripeLineItems(lineItems, shippingOption, taxAmount, discountAmount), 4001 shippingRates: quotesResponse?.map((option) => { 4002 const { description, amount_cents } = option; 4003 return { 4004 id: JSON.stringify(option), 4005 amount: amount_cents, 4006 displayName: description 4007 }; 4008 }) ?? [ 4009 { 4010 id: STRIPE_SKIP_SHIPPING_ID, 4011 amount: 0, 4012 displayName: "Free" 4013 } 4014 ] 4015 }; 4016} 4017function parseCssVars(element, obj) { 4018 Object.keys(obj ?? {}).forEach((key) => { 4019 const value = obj[key]; 4020 if (typeof value === "object") { 4021 obj[key] = parseCssVars(element, value); 4022 } else { 4023 if (typeof value === "string" && value.includes("--")) { 4024 obj[key] = getComputedStyle(element).getPropertyValue(value); 4025 } 4026 } 4027 }); 4028 return obj; 4029} 4030
4031// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/RebillyCheckout/checkout-globals.ts 4032var CheckoutStates = { 4033 OTO: "oto", 4034 GUEST: "guest", 4035 SAVED: "saved", 4036 UPGRADE_DOWNGRADE: "upgradeDowngrade", 4037 REACTIVATE: "reactivate" 4038}; 4039var StoreStates = { 4040 START: "start", 4041 INITIALIZING: "initializing", 4042 INITIALIZED: "initialized", 4043 FILLING_FORM: "filling-form", 4044 SUBMITTING: "submitting", 4045 SUBMITTED: "submitted" 4046}; 4047var SummaryStates = { 4048 WAITING: "waiting", 4049 CALCULATING: "calculating", 4050 ERROR: "error", 4051 OK: "ok" 4052}; 4053var CouponStates = { 4054 READY: "ready", 4055 APPLYING: "applying", 4056 APPLIED: "applied", 4057 ERROR: "error" 4058}; 4059var PaymentStates = { 4060 START: "start", 4061 INITIALIZING: "initializing", 4062 LOADING: "loading", 4063 INITIALIZED: "initialized" 4064}; 4065var SubmittingStates = { 4066 IDLE: "idle", 4067 START: "start", 4068 WAITING_ON_QUEUE: "waiting-on-queue", 4069 ERROR: "error", 4070 DONE: "done" 4071}; 4072var states = { 4073 StoreStates, 4074 SummaryStates, 4075 PaymentStates, 4076 SubmittingStates, 4077 PaypalStates, 4078 CouponStates, 4079 ErrorTypes, 4080 CheckoutStates 4081}; 4082var globals = getSSRGlobalResourceData(); 4083var ssrDynamicData = globalThis.getSSRDynamicStoreData(globals.products); 4084globalThis.Checkout = { 4085 ...states, 4086 ...globals, 4087 ssrDynamicData, 4088 utils: buildUtils() 4089}; 4090window.addEventListener( 4091 "keydown", 4092 function(e) { 4093 if (e.key == "Enter") { 4094 if (globalThis.Checkout.store?.payment.type.get() == "apple-pay") { 4095 e.preventDefault(); 4096 return false; 4097 } 4098 } 4099 }, 4100 true 4101); 4102var cleanupEmptyErrors = (errors) => { 4103 if (errors.globalErrors.length == 0) delete errors.globalErrors; 4104 if (Object.keys(errors.fields).length == 0) delete errors.fields; 4105 if (Object.keys(errors).length == 0) return null; 4106 return errors; 4107}; 4108function hasErrors(errors) { 4109 return (errors?.globalErrors ?? []).length != 0 || Object.keys(errors?.fields ?? {}).length != 0; 4110} 4111function productErrors(cart, showAllErrors) { 4112 const errors = { 4113 globalErrors: [], 4114 fields: {} 4115 }; 4116 if (showAllErrors) { 4117 const hasProducts = cart.items.filter((p) => !globalThis.Checkout.productsById[p.product_id].bump).some((item) => item.quantity > 0); 4118 if (!hasProducts) { 4119 errors.globalErrors.push({ message: "At least one product should be selected" }); 4120 } 4121 } 4122 return cleanupEmptyErrors(errors); 4123} 4124function shippingOptionErrors(loadingShipping, cart, shippingOptions, shippingOption, showAllErrors, paymentType) { 4125 const errors = { 4126 globalErrors: [], 4127 fields: {} 4128 }; 4129 if (!showAllErrors || loadingShipping || !hasPhysicalProductsWithParams(cart) || paymentType == "apple-pay") { 4130 return null; 4131 } 4132 const shippingOptionIsValid = shippingOption && shippingOptions?.length > 0; 4133 if (!shippingOptionIsValid) { 4134 const error = { message: "Shipping is not available for this location" }; 4135 errors.fields.shippingOption = error; 4136 errors.globalErrors.push(error); 4137 } 4138 return cleanupEmptyErrors(errors); 4139} 4140function tosErrors(accepted, present, showTosErrors) { 4141 if (present && showTosErrors && !accepted) { 4142 return { globalErrors: [{ message: "You must accept the terms of service" }] }; 4143 } else { 4144 return {}; 4145 } 4146} 4147function summaryErrors(summary) { 4148 const errors = { 4149 globalErrors: [], 4150 fields: {} 4151 }; 4152 if (summary.state == SummaryStates.ERROR) { 4153 if (summary.error) { 4154 errors.globalErrors.push({ message: summary.error.message }); 4155 } else { 4156 errors.globalErrors.push({ message: "There was an error calculating your order total" }); 4157 } 4158 } 4159 return cleanupEmptyErrors(errors); 4160} 4161function addressErrors(address, showAllErrors, fields) { 4162 const errors = { 4163 globalErrors: [], 4164 fields: {} 4165 }; 4166 fields.forEach((field) => { 4167 const value = address[field]; 4168 if (value == void 0 && !showAllErrors) return; 4169 const { valid, message } = validateValue(field, value); 4170 if (!valid) { 4171 errors.fields[field] = { message }; 4172 } 4173 }); 4174 return cleanupEmptyErrors(errors); 4175} 4176function contactErrors(contact, fields, showAllErrors) { 4177 showAllErrors = showAllErrors ?? true; 4178 const errors = { 4179 globalErrors: [], 4180 fields: {} 4181 }; 4182 fields.forEach((field) => { 4183 const value = contact[field]; 4184 if (value == void 0 && !showAllErrors) return; 4185 const { valid, message } = validateValue(field, value); 4186 if (!valid) { 4187 errors.fields[field] = { message }; 4188 } 4189 }); 4190 return cleanupEmptyErrors(errors); 4191} 4192function buildUtils() { 4193 const billingErrors = (billing, billingSameAsShipping, showAllErrors, cart, mode, billingFields, billingApiErrorsByField, paymentType, paymentId) => { 4194 if (hasPhysicalProductsWithParams(cart) && billingSameAsShipping || mode == CheckoutStates.UPGRADE_DOWNGRADE || mode == CheckoutStates.OTO && !paymentId || paymentType == "apple-pay") { 4195 return null; 4196 } else if (billingApiErrorsByField) { 4197 return { 4198 fields: billingApiErrorsByField 4199 }; 4200 } else if (mode == globalThis.Checkout.CheckoutStates.REACTIVATE || mode == globalThis.Checkout.CheckoutStates.SAVED) { 4201 const savedBillingAddresses = globalThis.Checkout.store.billing_addresses.get(); 4202 const isActiveAddressSaved = savedBillingAddresses.find((addr) => addr.id == billing.id); 4203 if (!isActiveAddressSaved) { 4204 return addressErrors(billing, showAllErrors, billingFields); 4205 } 4206 return null; 4207 } else if (mode == CheckoutStates.OTO && paymentId) { 4208 return null; 4209 } else { 4210 return addressErrors(billing, showAllErrors, billingFields); 4211 } 4212 }; 4213 const shippingErrors = (shipping, showAllErrors, cart, mode, shippingFields, paymentType) => { 4214 if (!hasPhysicalProductsWithParams(cart) || paymentType == "apple-pay") { 4215 return null; 4216 } 4217 return addressErrors(shipping, showAllErrors, shippingFields); 4218 }; 4219 return { 4220 productErrors, 4221 billingErrors, 4222 shippingErrors, 4223 addressErrors, 4224 cleanupEmptyErrors, 4225 hasErrors, 4226 hasPhysicalProductsWithParams, 4227 skipBillingAddress: (store) => { 4228 const isNotDigitalWalletPayment = store.payment.type.get() != "apple-pay"; 4229 return isNotDigitalWalletPayment && store.billingFields.get().length == 0; 4230 }, 4231 hasPhysicalProducts: () => { 4232 const cart = globalThis.Checkout.computed.checkoutCart.get(); 4233 return hasPhysicalProductsWithParams(cart); 4234 }, 4235 hasValidDataForOrderPreview: (options) => { 4236 const mode = globalThis.Checkout.store.checkout.mode.get(); 4237 const cart = globalThis.Checkout.computed.checkoutCart.get(); 4238 const billing = globalThis.Checkout.store.billing.get(); 4239 const shipping = globalThis.Checkout.store.shipping.get(); 4240 const billingSameAsShipping = globalThis.Checkout.store.billingSameAsShipping.get(); 4241 const billingApiErrorsByField = globalThis.Checkout.store.billingApiErrorsByField.get(); 4242 const paymentType = globalThis.Checkout.store.payment.type.get(); 4243 const paymentId = globalThis.Checkout.store.payment.id.get(); 4244 const showAllBillingErrors = true; 4245 const showAllShippingErrors = true; 4246 const showAllProductErrors = true; 4247 const pErrors = productErrors(cart, showAllProductErrors); 4248 const bErrors = billingErrors( 4249 billing, 4250 billingSameAsShipping, 4251 showAllBillingErrors, 4252 cart, 4253 mode, 4254 options.billingFields, 4255 billingApiErrorsByField, 4256 paymentType, 4257 paymentId 4258 ); 4259 const sErrors = shippingErrors(shipping, showAllShippingErrors, cart, mode, options.shippingFields, paymentType); 4260 return !hasErrors(pErrors) && !hasErrors(bErrors) && !hasErrors(sErrors); 4261 }, 4262 hasValidDataForShippingOptions: (options) => { 4263 const mode = globalThis.Checkout.store.checkout.mode.get(); 4264 const cart = globalThis.Checkout.computed.checkoutCart.get(); 4265 const shipping = globalThis.Checkout.store.shipping.get(); 4266 const paymentType = globalThis.Checkout.store.payment.type.get(); 4267 const showAllShippingErrors = true; 4268 const sErrors = shippingErrors(shipping, showAllShippingErrors, cart, mode, options.shippingFields, paymentType); 4269 return !hasErrors(sErrors); 4270 }, 4271 hasValidDataForTaxes: (options) => { 4272 const mode = globalThis.Checkout.store.checkout.mode.get(); 4273 const cart = globalThis.Checkout.computed.checkoutCart.get(); 4274 const billing = globalThis.Checkout.store.billing.get(); 4275 const billingSameAsShipping = globalThis.Checkout.store.billingSameAsShipping.get(); 4276 const billingApiErrorsByField = globalThis.Checkout.store.billingApiErrorsByField.get(); 4277 const paymentType = globalThis.Checkout.store.payment.type.get(); 4278 const paymentId = globalThis.Checkout.store.payment.id.get(); 4279 const showAllBillingErrors = true; 4280 const bErrors = billingErrors( 4281 billing, 4282 billingSameAsShipping, 4283 showAllBillingErrors, 4284 cart, 4285 mode, 4286 options.billingFields, 4287 billingApiErrorsByField, 4288 paymentType, 4289 paymentId 4290 ); 4291 return !hasErrors(bErrors); 4292 }, 4293 canSubmit: () => { 4294 const state = globalThis.Checkout.store.state.get(); 4295 const summary = globalThis.Checkout.store.summary.get(); 4296 return state == globalThis.Checkout.StoreStates.FILLING_FORM && summary.state == globalThis.Checkout.SummaryStates.OK; 4297 } 4298 }; 4299} 4300
4301// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-store.ts 4302var encodeVirtualInstallmentId = (duration, type) => { 4303 return `${duration}-${type}`; 4304}; 4305var decodeVirtualInstallmentId = (virtualId) => { 4306 if (!virtualId) return null; 4307 const parts = virtualId.split("-"); 4308 if (parts.length !== 2) return null; 4309 const duration = parseInt(parts[0], 10); 4310 const type = parts[1]; 4311 if (isNaN(duration)) return null; 4312 return { duration, type }; 4313}; 4314var getInitialCriticalErrors = (enabledPayments, enabledExpressPayments) => { 4315 const initialCriticalErrors = []; 4316 if ((enabledPayments ?? []).length == 0 && (enabledExpressPayments ?? []).length == 0) { 4317 initialCriticalErrors.push({ code: ERROR_CODES.EMPTY_PAYMENT_METHODS_ERROR }); 4318 } 4319 if (!globalThis.globalResourceData.productVariantWithNoBump?.id) { 4320 initialCriticalErrors.push({ code: ERROR_CODES.EMPTY_PRODUCTS_ERROR }); 4321 } 4322 return initialCriticalErrors; 4323}; 4324var buildPaymentBucket = (type) => { 4325 switch (type) { 4326 case "payment-card": 4327 return { events: map({}), token: atom(null) }; 4328 case "paypal": 4329 return { state: atom({ state: globalThis.Checkout.PaypalStates.IDLE }), token: atom(null) }; 4330 default: 4331 return { token: atom(null) }; 4332 } 4333}; 4334var buildPaymentBuckets = () => STORE_PAYMENT_TYPES.reduce( 4335 (buckets, type) => ({ ...buckets, [type]: buildPaymentBucket(type) }), 4336 {} 4337); 4338var create = (billingFields, shippingFields, enabledPayments, enabledExpressPayments) => { 4339 const paymentMethods = typeof globalThis.Checkout.savedPaymentMethods === "string" ? JSON.parse(globalThis.Checkout.savedPaymentMethods) : globalThis.Checkout.savedPaymentMethods; 4340 const paymentDataId = paymentMethods?.[0]?.id ?? null; 4341 const initialPaymentMethod = resolveInitialPaymentType(paymentMethods?.[0]?.type, enabledPayments); 4342 const { 4343 mode, 4344 contact, 4345 shipping, 4346 billing, 4347 billingSameAsShipping, 4348 billing_addresses, 4349 shipping_addresses 4350 } = globalThis.Checkout.ssrDynamicData; 4351 return { 4352 state: atom(globalThis.Checkout.StoreStates.START), 4353 checkout: { 4354 mode: atom(mode), 4355 lastModeIndependentOfCartItems: atom(mode), 4356 step: atom(0) 4357 }, 4358 contact: map(contact), 4359 contact_pending_auth: map({ authenticated: false }), 4360 shipping: map(shipping), 4361 shipping_addresses: atom(shipping_addresses ?? []), 4362 loadingShipping: atom(false), 4363 shippingOptions: atom([]), 4364 isUpdatingRebilly: atom(true), 4365 shippingOption: atom(), 4366 billingFields: atom(billingFields), 4367 shippingFields: atom(shippingFields), 4368 payment: { 4369 state: atom(globalThis.Checkout.PaymentStates.START), 4370 id: atom(paymentDataId), 4371 type: atom(initialPaymentMethod), 4372 virtualInstallmentId: atom(null), 4373 ...buildPaymentBuckets() 4374 }, 4375 paymentMethods: atom(paymentMethods ?? []), 4376 billing: map(billing), 4377 billingApiErrorsByField: atom(null), 4378 billing_addresses: atom(billing_addresses ?? []), 4379 billingSameAsShipping: atom(billingSameAsShipping), 4380 coupons: { 4381 appliedCode: atom(""), 4382 currentCode: atom(""), 4383 errorMessage: atom(""), 4384 state: atom(globalThis.Checkout.CouponStates.READY) 4385 }, 4386 summary: atom({ 4387 state: globalThis.Checkout.SummaryStates.WAITING, 4388 data: {} 4389 }), 4390 tos: { 4391 accepted: atom(false), 4392 present: atom(false) 4393 }, 4394 criticalErrors: atom(getInitialCriticalErrors(enabledPayments, enabledExpressPayments)), 4395 showAllErrors: { 4396 contact: atom(false), 4397 shipping: atom(false), 4398 billing: atom(false), 4399 shippingOption: atom(false), 4400 payment: atom(false), 4401 products: atom(false), 4402 tos: atom(false), 4403 summary: atom(false) 4404 }, 4405 submitting: atom({ 4406 state: globalThis.Checkout.SubmittingStates.IDLE 4407 }), 4408 incrScrollToFirstVisibleError: atom(0), 4409 threeds: map({ 4410 show: false, 4411 approvalUrl: null 4412 }), 4413 featureFlags: { 4414 isShippingEnabled: atom(false) 4415 }, 4416 selectedOrderDetailId: atom(null), 4417 phoneNumberInitialized: atom(false) 4418 }; 4419}; 4420var buildComputed = (store, contactFields, shippingFields, totalSteps) => { 4421 const computedModeLeaveEnterEvent = atom({}); 4422 onMount(computedModeLeaveEnterEvent, () => { 4423 let previousMode; 4424 return store.checkout.mode.subscribe((mode) => { 4425 if (previousMode) {
4426 computedModeLeaveEnterEvent.set({ 4427 leave: previousMode, 4428 next: mode 4429 }); 4430 } 4431 computedModeLeaveEnterEvent.set({ 4432 enter: mode, 4433 previous: previousMode 4434 }); 4435 previousMode = mode; 4436 }); 4437 }); 4438 const computedContactErrors = computed( 4439 [store.checkout.mode, store.contact, store.showAllErrors.contact], 4440 (mode, contact, showAllErrors) => { 4441 if (mode != globalThis.Checkout.CheckoutStates.GUEST) return null; 4442 return contactErrors(contact, contactFields, showAllErrors); 4443 } 4444 ); 4445 const computedCheckoutCart = buildProductSelectComputed(); 4446 const computedBillingErrors = computed( 4447 [ 4448 store.billing, 4449 store.billingSameAsShipping, 4450 store.showAllErrors.billing, 4451 computedCheckoutCart, 4452 store.checkout.mode, 4453 store.payment.type, 4454 store.payment.id, 4455 store.billingApiErrorsByField, 4456 store.billingFields 4457 ], 4458 (billing, billingSameAsShipping, showAllErrors, cart, mode, paymentType, paymentId, billingApiErrorsByField, billingFields) => { 4459 return globalThis.Checkout.utils.billingErrors( 4460 billing, 4461 billingSameAsShipping, 4462 showAllErrors, 4463 cart, 4464 mode, 4465 billingFields, 4466 billingApiErrorsByField, 4467 paymentType, 4468 paymentId 4469 ); 4470 } 4471 ); 4472 const computedShippingErrors = computed( 4473 [store.shipping, store.showAllErrors.shipping, computedCheckoutCart, store.checkout.mode, store.payment.type], 4474 (shipping, showAllErrors, cart, mode, paymentType) => { 4475 return globalThis.Checkout.utils.shippingErrors(shipping, showAllErrors, cart, mode, shippingFields, paymentType); 4476 } 4477 ); 4478 const computedHasValidShippingAddress = computed( 4479 [computedCheckoutCart, store.shipping, store.checkout.mode], 4480 (cart, shipping, mode) => { 4481 return !globalThis.Checkout.utils.shippingErrors(shipping, true, cart, mode, shippingFields); 4482 } 4483 ); 4484 const computedProductErrors = computed( 4485 [computedCheckoutCart, store.showAllErrors.products], 4486 (cart, showAllErrors) => { 4487 return globalThis.Checkout.utils.productErrors(cart, showAllErrors); 4488 } 4489 ); 4490 const computedShippingOptionErrors = computed( 4491 [ 4492 store.loadingShipping, 4493 computedCheckoutCart, 4494 store.shippingOptions, 4495 store.shippingOption, 4496 store.showAllErrors.shippingOption, 4497 store.payment.type 4498 ], 4499 (...args) => shippingOptionErrors(...args) 4500 ); 4501 const computedPaymentErrors = computed( 4502 [ 4503 store.payment.id, 4504 store.payment.type, 4505 store.payment["payment-card"].events, 4506 store.payment.paypal.state, 4507 store.payment.paypal.token, 4508 store.showAllErrors.payment, 4509 store.checkout.mode 4510 ], 4511 (id, type, cardEvents, paypalState, paypalToken, showAllErrors, mode) => { 4512 const errors = { 4513 globalErrors: [], 4514 fields: {} 4515 }; 4516 if (!id && mode != globalThis.Checkout.CheckoutStates.UPGRADE_DOWNGRADE) { 4517 if (type == "payment-card") { 4518 let hasEvent = !!Object.keys(cardEvents).length; 4519 if (hasEvent) { 4520 Object.entries(cardEvents).forEach(([field, event]) => { 4521 if (!event) { 4522 event = { source: field }; 4523 } else { 4524 hasEvent = true; 4525 } 4526 const { valid, message } = validateValue("card", event); 4527 if (!valid) { 4528 errors.fields[field] = { message }; 4529 } 4530 }); 4531 } else if (showAllErrors) { 4532 errors.globalErrors.push({ message: "Missing payment information" }); 4533 } 4534 } else if (type == "paypal") { 4535 if (showAllErrors && !(paypalState.state == globalThis.Checkout.PaypalStates.PAYMENT_METHOD_APPROVED && paypalToken)) { 4536 errors.globalErrors.push({ message: "Missing payment information" }); 4537 } 4538 } 4539 } 4540 return cleanupEmptyErrors(errors); 4541 } 4542 ); 4543 const computedTosErrors = computed( 4544 [store.tos.accepted, store.tos.present, store.showAllErrors.tos], 4545 (...args) => tosErrors(...args) 4546 ); 4547 const computedSummaryErrors = computed([store.summary], (summary) => summaryErrors(summary)); 4548 const computedErrorsByName = { 4549 contact: computedContactErrors, 4550 billing: computedBillingErrors, 4551 shipping: computedShippingErrors, 4552 shippingOption: computedShippingOptionErrors, 4553 products: computedProductErrors, 4554 payment: computedPaymentErrors, 4555 tos: computedTosErrors, 4556 summary: computedSummaryErrors 4557 }; 4558 const computedHasPhysicalProducts = computed(computedCheckoutCart, (cart) => { 4559 return globalThis.Checkout.utils.hasPhysicalProductsWithParams(cart); 4560 }); 4561 const computedPossibleOtoWithFreeShipping = computed( 4562 [computedCheckoutCart, store.checkout.mode, store.shippingOptions, store.loadingShipping], 4563 (cart, mode, shippingOptions, loadingShipping) => { 4564 return mode === "oto" && globalThis.Checkout.utils.hasPhysicalProductsWithParams(cart) && // shipping options unknown /
4564not loaded 4565 (!shippingOptions || // pending with no current shipping options 4566 loadingShipping && shippingOptions.length === 0 || // Exactly one shipping option with amount zero 4567 shippingOptions?.length === 1 && parseInt(shippingOptions[0].amount.amount) === 0); 4568 } 4569 ); 4570 const computedHasShippingEnabled = computed( 4571 [computedCheckoutCart, store.featureFlags.isShippingEnabled], 4572 (cart, isShippingEnabled) => { 4573 return globalThis.Checkout.utils.hasPhysicalProductsWithParams(cart) && isShippingEnabled; 4574 } 4575 ); 4576 const computedHideShipping = computed( 4577 [computedHasShippingEnabled, computedPossibleOtoWithFreeShipping], 4578 (isShippingEnabled, possibleOtoWithFreeShipping) => { 4579 return !isShippingEnabled || possibleOtoWithFreeShipping; 4580 } 4581 ); 4582 const computedCurrentPaymentMethod = computed([store.payment.id], (currentPaymentId) => { 4583 return store.paymentMethods.get().find((pm) => pm.id == currentPaymentId); 4584 }); 4585 const computedIsCouponReady = computed([store.state, computedCheckoutCart], (state, cart) => { 4586 const showAllProductErrors = true; 4587 const pErrors = globalThis.Checkout.utils.productErrors(cart, showAllProductErrors); 4588 return state == globalThis.Checkout.StoreStates.FILLING_FORM && !globalThis.Checkout.utils.hasErrors(pErrors); 4589 }); 4590 const computedIsDigitalWalletReadyToStart = computed( 4591 [store.checkout.mode, store.state, store.summary, computedCheckoutCart], 4592 (mode, state, summary, cart) => { 4593 const showAllProductErrors = true; 4594 const pErrors = globalThis.Checkout.utils.productErrors(cart, showAllProductErrors); 4595 return state == globalThis.Checkout.StoreStates.FILLING_FORM && !globalThis.Checkout.utils.hasErrors(pErrors); 4596 } 4597 ); 4598 const computedHideContactInformationForm = computed( 4599 [store.checkout.mode, store.payment.type], 4600 (mode, paymentType) => { 4601 return paymentType == "apple-pay" && mode == "guest" && totalSteps == 1; 4602 } 4603 ); 4604 const computedIsOTORetrialPayment = computed( 4605 [store.checkout.mode, store.payment.id], 4606 (mode, paymentId) => mode == globalThis.Checkout.CheckoutStates.OTO && !paymentId 4607 ); 4608 return { 4609 errorsByName: computedErrorsByName, 4610 modeLeaveEnterEvent: computedModeLeaveEnterEvent, 4611 hasPhysicalProducts: computedHasPhysicalProducts, 4612 hasShippingEnabled: computedHasShippingEnabled, 4613 hideShipping: computedHideShipping, 4614 hasValidShippingAddress: computedHasValidShippingAddress, 4615 isDigitalWalletReadyToStart: computedIsDigitalWalletReadyToStart, 4616 isCouponReady: computedIsCouponReady, 4617 contactErrors: computedContactErrors, 4618 productErrors: computedProductErrors, 4619 billingErrors: computedBillingErrors, 4620 shippingErrors: computedShippingErrors, 4621 shippingOptionErrors: computedShippingOptionErrors, 4622 paymentMethod: computedCurrentPaymentMethod, 4623 paymentErrors: computedPaymentErrors, 4624 tosErrors: computedTosErrors, 4625 summaryErrors: computedSummaryErrors, 4626 hideContactInformationForm: computedHideContactInformationForm, 4627 isOTORetrialPayment: computedIsOTORetrialPayment, 4628 isNewDigitalWalletPayment: computed( 4629 [store.payment.id, store.payment.type], 4630 (id, paymentType) => !id && paymentType == "apple-pay" 4631 ), 4632 checkoutCart: computedCheckoutCart 4633 }; 4634}; 4635var initializeUtilities = (store, computed2) => { 4636 initializeStoreUtilities(store, computed2); 4637 setupCFEnableDevTools(); 4638}; 4639var initializeStoreUtilities = (store, computed2) => { 4640 const proxyCache = /* @__PURE__ */ new WeakMap(); 4641 const storeValueCache = /* @__PURE__ */ new WeakMap(); 4642 const DEBOUNCE_INTERVAL = 50; 4643 const stores = { 4644 store, 4645 computed: computed2 4646 }; 4647 function createDeepNanostoreProxy(target, onChange) { 4648 return new Proxy(target, { 4649 get(target2, property) { 4650 const item = target2[property]; 4651 if (property === "__store") { 4652 return item; 4653 } 4654 if (item && typeof item === "object") { 4655 if (proxyCache.has(item)) return proxyCache.get(item); 4656 if (isStore(item)) { 4657 const __store = item;
4658 const storeValue = { 4659 __store, 4660 __value: peek(__store) 4661 }; 4662 storeValueCache.set(item, storeValue); 4663 __store.listen((value) => { 4664 storeValue.__value = value; 4665 onChange(); 4666 }); 4667 return storeValue; 4668 } else { 4669 const proxy2 = createDeepNanostoreProxy(item, onChange); 4670 proxyCache.set(item, proxy2); 4671 return proxy2; 4672 } 4673 } 4674 return item; 4675 } 4676 }); 4677 } 4678 function peek(store2) { 4679 return store2.value; 4680 } 4681 function isStore(value) { 4682 return value && value.subscribe; 4683 } 4684 let debounceTimeout; 4685 const proxy = createDeepNanostoreProxy(stores, function onChange() { 4686 clearTimeout(debounceTimeout); 4687 debounceTimeout = setTimeout(() => { 4688 window.dispatchEvent(new CustomEvent("checkout:store:change")); 4689 }, DEBOUNCE_INTERVAL); 4690 }); 4691 globalThis.Checkout.utils.getStoreJson = (tab = 0) => { 4692 return JSON.stringify( 4693 proxy, 4694 function replacer(key, value) { 4695 if (["__store"].includes(key)) return; 4696 if (value && Object.prototype.hasOwnProperty.call(value, "__value")) { 4697 return value.__value; 4698 } 4699 return value; 4700 }, 4701 tab 4702 ); 4703 }; 4704}; 4705var setupCFEnableDevTools = () => { 4706 if (localStorage.getItem("cf2:devtools:enabled")) { 4707 trackUpdatesCheckoutUpdates(); 4708 } 4709 globalThis.CFEnableDevTools = () => { 4710 localStorage.setItem("cf2:devtools:enabled", "true"); 4711 trackUpdatesCheckoutUpdates(); 4712 }; 4713 function trackUpdatesCheckoutUpdates() { 4714 document.querySelectorAll('[data-page-element="Checkout/V2"]').forEach((el) => { 4715 el.insertAdjacentHTML("afterend", '<div class="checkout-store-log"><pre></pre></div>'); 4716 document.querySelector(".checkout-store-log").style.cssText = ` 4717 z-index: 10; 4718 top: 0; 4719 background: rgba(100,100,1005,0.1); 4720 height: 100; 4721 display: flex; 4722 flex-direction: column; 4723 justify-content: center;`; 4724 document.querySelector(".checkout-store-log pre").style.cssText = ` 4725 font-size: 12px; 4726 font-weight: bold; 4727 width: fit-content;`; 4728 }); 4729 const checkoutStoreLog = document.querySelector(".checkout-store-log"); 4730 const renderDevToolsState = initReduxDevTools().render; 4731 render(); 4732 window.addEventListener("checkout:store:change", () => { 4733 render(); 4734 if (renderDevToolsState) { 4735 renderDevToolsState(); 4736 } 4737 }); 4738 function initReduxDevTools() { 4739 let store; 4740 const reduxUrl = "https://cdnjs.cloudflare.com/ajax/libs/redux/4.2.1/redux.min.js"; 4741 const scriptEle = document.createElement("script"); 4742 scriptEle.setAttribute("src", reduxUrl); 4743 document.body.appendChild(scriptEle); 4744 scriptEle.addEventListener("load", () => { 4745 store = globalThis.Redux.createStore( 4746 (state, action) => action.state || state, 4747 JSON.parse(globalThis.Checkout.utils.getStoreJson()), 4748 globalThis.__REDUX_DEVTOOLS_EXTENSION__ && globalThis.__REDUX_DEVTOOLS_EXTENSION__() 4749 ); 4750 }); 4751 return { 4752 render() { 4753 if (store) { 4754 store.dispatch({ 4755 type: "state", 4756 state: JSON.parse(globalThis.Checkout.utils.getStoreJson()) 4757 }); 4758 } 4759 } 4760 }; 4761 } 4762 function render() { 4763 let json; 4764 let error; 4765 try { 4766 const data = JSON.parse(globalThis.Checkout.utils.getStoreJson(4)); 4767 json = JSON.stringify(data, null, 2); 4768 } catch (err) { 4769 error = err; 4770 console.log(error); 4771 } 4772 checkoutStoreLog.querySelector("pre").innerHTML = error ? error.message : ["--- State ---", json].join("\n"); 4773 } 4774 } 4775}; 4776
4777// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-submit.ts 4778var REBILLY_PAYMENT_METHOD_BY_TYPE_MAP = { 4779 Klarna: "klarna-payments" 4780}; 4781var _redirecTo, _threedsListenerEnabled, _formSubmitPayload, _CheckoutSubmit_static, leadSourceGenerator_fn, submitRebilly_fn, buildPaymentMethodDetails_fn, buildRegistrationDetails_fn, shouldIncludeRegistration_fn, buildAddressParams_fn, submitOrderAsync_fn, handleFormSubmitRedirect_fn, add3dsListener_fn; 4782var CheckoutSubmit = class { 4783 static submitFromButtonClick(submitButton, onValidationError, redirectOverride) { 4784 __privateMethod(this, _CheckoutSubmit_static, add3dsListener_fn).call(this); 4785 const checkoutElement = submitButton.closest(".elCheckout"); 4786 if (this.checkSubmitShowErrors({ skipFields: /* @__PURE__ */ new Set(["payment"]) }) && this.checkSubmitShowErrors({ onlyFields: /* @__PURE__ */ new Set(["payment"]) }) && globalThis.Checkout.utils.canSubmit() && checkValidCustomFields(checkoutElement)) { 4787 globalThis.Checkout.store.state.set(globalThis.Checkout.StoreStates.SUBMITTING); 4788 globalThis.Checkout.store.submitting.set({ 4789 state: globalThis.Checkout.SubmittingStates.START 4790 }); 4791 const isUpgradeDowngrade = globalThis.Checkout.store.checkout.mode.get() == globalThis.Checkout.CheckoutStates.UPGRADE_DOWNGRADE; 4792 const capturedPaymentMethodId = globalThis.Checkout.store.payment.id.get(); 4793 const canSkipSubmitRebilly = isUpgradeDowngrade || capturedPaymentMethodId; 4794 if (canSkipSubmitRebilly) { 4795 const payload = this.buildPayloadFromStore({ 4796 contact: globalThis.Checkout.store.contact.get(), 4797 turnstileToken: globalThis.Checkout.turnstileToken, 4798 shippingAddress: globalThis.Checkout.store.shipping.get(), 4799 billingAddress: globalThis.Checkout.store.billing.get(), 4800 paymentMethodDetails: __privateMethod(this, _CheckoutSubmit_static, buildPaymentMethodDetails_fn).call(this) ?? {}, 4801 selectedShippingOption: globalThis.Checkout.store.shippingOption.get(), 4802 skipBillingAddress: globalThis.Checkout.utils.skipBillingAddress(globalThis.Checkout.store), 4803 redirectOverride 4804 }); 4805 return this.submit(payload); 4806 } else { 4807 const paymentType = globalThis.Checkout.store.payment.type.get(); 4808 if (["Klarna", "payment-card"].includes(paymentType)) { 4809 return __privateMethod(this, _CheckoutSubmit_static, submitRebilly_fn).call(this, onValidationError).then((tokenData) => { 4810 if (!tokenData && paymentType === "Klarna") { 4811 if (globalThis.Checkout.store.state.get() === globalThis.Checkout.StoreStates.SUBMITTING) { 4812 globalThis.Checkout.store.state.set(globalThis.Checkout.StoreStates.FILLING_FORM); 4813 globalThis.Checkout.store.submitting.set({ 4814 state: globalThis.Checkout.SubmittingStates.IDLE 4815 }); 4816 } 4817 return; 4818 } 4819 globalThis.Checkout.store.payment[paymentType].token.set(tokenData.id); 4820 const payload = this.buildPayloadFromStore({ 4821 contact: globalThis.Checkout.store.contact.get(), 4822 turnstileToken: globalThis.Checkout.turnstileToken, 4823 shippingAddress: globalThis.Checkout.store.shipping.get(), 4824 billingAddress: globalThis.Checkout.store.billing.get(), 4825 paymentMethodDetails: __privateMethod(this, _CheckoutSubmit_static, buildPaymentMethodDetails_fn).call(this) ?? {}, 4826 selectedShippingOption: globalThis.Checkout.store.shippingOption.get(), 4827 skipBillingAddress: globalThis.Checkout.utils.skipBillingAddress(globalThis.Checkout.store), 4828 redirectOverride 4829 }); 4830 return this.submit(payload); 4831 }); 4832 } else { 4833 const payload = this.buildPayloadFromStore({ 4834 contact: globalThis.Checkout.store.contact.get(), 4835 turnstileToken: globalThis.Checkout.turnstileToken, 4836 shippingAddress: globalThis.Checkout.store.shipping.get(), 4837 billingAddress: globalThis.Checkout.store.billing.get(), 4838 paymentMethodDetails: __privateMethod(this, _CheckoutSubmit_static, buildPaymentMethodDetails_fn).call(this) ?? {}, 4839 selectedShippingOption: globalThis.Checkout.store.shippingOption.get(), 4840 skipBillingAddress: globalThis.Checkout.utils.skipBillingAddress(globalThis.Checkout.store), 4841 redirectOverride 4842 }); 4843 return this.submit(payload); 4844 } 4845 } 4846 } else { 4847 onValidationError(); 4848 } 4849 } 4850 static checkSubmitShowErrors(options) { 4851 const { onlyFields, skipFields } = options ?? {}; 4852 return Object.entries(globalThis.Checkout.computed.errorsByName).map(([name, computed2]) => { 4853 if (onlyFields && !onlyFields.has(name)) return true; 4854 if (skipFields && skipFields.has(name)) return true; 4855 globalThis.Checkout.store.showAllErrors[name].set(true); 4856 return !globalThis.Checkout.utils.hasErrors(computed2.get()); 4857 }).every((v) => !!v); 4858 } 4859 static buildPayloadFromStore(payload) { 4860 const addressParams = __privateMethod(this, _CheckoutSubmit_static, buildAddressParams_fn).call(this, { 4861 billingAddress: payload.billingAddress, 4862 shippingAddress: payload.shippingAddress 4863 }, {
4864 skipBillingAddress: payload.skipBillingAddress 4865 }) ?? {}; 4866 const paymentDetails = payload.paymentMethodDetails; 4867 const purchaseCartDetails = this.buildPurchaseCartDetails(); 4868 const customFields = buildCustomFields(); 4869 const contact = payload.contact; 4870 const couponCode = globalThis.Checkout.store.coupons.appliedCode.get(); 4871 const couponData = couponCode ? { coupon_codes: [couponCode] } : {}; 4872 const virtualInstallmentId = globalThis.Checkout.store.payment.virtualInstallmentId.get(); 4873 const installmentData = decodeVirtualInstallmentId(virtualInstallmentId); 4874 const rebillyPayload = { 4875 // NOTE: Temp fix for FHL 2023 4876 ...customFields ? customFields : {}, 4877 contact: { 4878 ...contact, 4879 ...addressParams.shipping ?? {} 4880 }, 4881 turnstileToken: payload.turnstileToken, 4882 ...addressParams.billing ?? {}, 4883 purchase: { 4884 ...couponData, 4885 ...purchaseCartDetails, 4886 ...paymentDetails, 4887 process_new_order: true, 4888 ...paymentDetails?.payment_method_type === "payment-card" && installmentData ? { 4889 installment_duration: installmentData.duration, 4890 installment_type: installmentData.type 4891 } : {} 4892 }, 4893 skip_billing_address: Boolean(payload.skipBillingAddress), 4894 skip_optin_track: document.getElementById("cfAR")?.getAttribute("data-leads-collected") === "true" 4895 }; 4896 if (__privateMethod(this, _CheckoutSubmit_static, shouldIncludeRegistration_fn).call(this)) rebillyPayload["registration"] = __privateMethod(this, _CheckoutSubmit_static, buildRegistrationDetails_fn).call(this); 4897 const selected_shipping_option = payload.selectedShippingOption; 4898 if (selected_shipping_option && Object.keys(selected_shipping_option).length > 1) { 4899 rebillyPayload.purchase.selected_shipping_option = selected_shipping_option; 4900 } 4901 const redirectUrl = payload.redirectOverride || __privateGet(this, _redirecTo); 4902 if (redirectUrl) { 4903 rebillyPayload.redirect_to = redirectUrl; 4904 } 4905 return rebillyPayload; 4906 } 4907 static generateShippingOptionId(shippingOption) { 4908 return [shippingOption.description, shippingOption.amount_formatted].join("$"); 4909 } 4910 static buildDigitalWalletTransactionData(summaryData, cart, shippingEnabled, shippingOptions) { 4911 const { line_items } = summaryData; 4912 const lineItems = line_items.map(({ price, description }, index) => { 4913 let label; 4914 if (line_items.length == cart.items.length) { 4915 const variantId = cart.items[index].variant_id; 4916 const variant = globalThis.Checkout.variantsById[variantId]; 4917 label = variant.name; 4918 } else { 4919 label = description; 4920 } 4921 return { 4922 label, 4923 amount: price 4924 }; 4925 }); 4926 if (summaryData.tax?.amount > 0) { 4927 lineItems.push({ 4928 label: "Taxes", 4929 amount: summaryData.tax.amount 4930 }); 4931 } 4932 if (summaryData.shipping?.amount > 0) { 4933 lineItems.push({ 4934 label: "Shipping", 4935 amount: summaryData.shipping.amount 4936 }); 4937 } 4938 if (summaryData.discount?.amount > 0) { 4939 lineItems.push({ 4940 label: "Discount", 4941 amount: -summaryData.discount?.amount 4942 }); 4943 } 4944 return { 4945 amount: summaryData.total.amount, 4946 lineItems, 4947 ...shippingEnabled ? { 4948 status: shippingOptions.length ? "success" : "fail", 4949 shippingOptions: shippingOptions.map((shippingOption) => ({ 4950 id: this.generateShippingOptionId(shippingOption), 4951 label: shippingOption.description, 4952 description: "", 4953 amount: Number(shippingOption.amount.amount) 4954 })) 4955 } : {} 4956 }; 4957 } 4958 static buildPurchaseCartDetails() { 4959 const checkoutCart = globalThis.Checkout.computed.checkoutCart.get(); 4960 const lineItems = checkoutCart.items.map( 4961 ({ variant_id, price_id, line_item_id, quantity }) => { 4962 return { 4963 id: variant_id, 4964 quantity, 4965 price_id, 4966 ...line_item_id ? { line_item_id } : {} 4967 }; 4968 } 4969 ); 4970 return { order_id: checkoutCart.order_id, product_variants: lineItems }; 4971 } 4972 static submit(payload) { 4973 if (localStorage.getItem("cf2:devtools:enabled")) { 4974 console.log("submitted data", payload); 4975 } 4976 const requestIdempotency = uuidv4();
4977 globalThis.CFDispatchEvent(globalThis.CFEvents.FORM_SUBMITTED, payload); 4978 let timer = null; 4979 __privateMethod(this, _CheckoutSubmit_static, submitOrderAsync_fn).call(this, payload, requestIdempotency, 3, () => { 4980 clearInterval(timer); 4981 globalThis.Checkout.store.submitting.set({ 4982 state: globalThis.Checkout.SubmittingStates.START 4983 }); 4984 }, (sleepTime) => { 4985 let remainingSeconds = sleepTime / 1e3; 4986 clearInterval(timer); 4987 timer = setInterval(() => { 4988 remainingSeconds -= 1; 4989 globalThis.Checkout.store.submitting.set({ 4990 state: globalThis.Checkout.SubmittingStates.WAITING_ON_QUEUE, 4991 remainingSeconds 4992 }); 4993 }, 1e3); 4994 }).then((response) => { 4995 if (response.status == 422) { 4996 response.json().then((responseJSON) => { 4997 const errorDetails = responseJSON.error_details; 4998 let errorDetailsMessage = responseJSON.error; 4999 if (responseJSON.error_details && !!errorDetails?.length) { 5000 errorDetailsMessage = errorDetails.map((e) => e.graceful_message ?? e.message).join("\n"); 5001 const mode = globalThis.Checkout.store.checkout.mode.get(); 5002 const isRetrieablePayment = mode == globalThis.Checkout.CheckoutStates.OTO && errorDetails.find((e) => e.source == "payment_gateway"); 5003 if (isRetrieablePayment) { 5004 globalThis.Checkout.store.showAllErrors.payment.set(false); 5005 globalThis.Checkout.store.payment.id.set(null); 5006 } 5007 } 5008 globalThis.Checkout.store.submitting.set({ 5009 state: globalThis.Checkout.SubmittingStates.ERROR, 5010 code: globalThis.Checkout.ErrorTypes.SERVER_ERROR_WITH_MESSAGE, 5011 message: errorDetailsMessage, 5012 actionable: isActionableCheckoutError(responseJSON) 5013 }); 5014 }); 5015 } else if (response.ok) { 5016 __privateSet(this, _formSubmitPayload, payload); 5017 globalThis.CFDispatchEvent(globalThis.CFEvents.FORM_SUBMITTED_OK, payload); 5018 if (response.headers.get("X-CF2-APPROVAL-URL")) { 5019 globalThis.Checkout.store.threeds.set({ 5020 show: true, 5021 approvalUrl: response.headers.get("X-CF2-APPROVAL-URL") 5022 }); 5023 } else { 5024 globalThis.Checkout.store.submitting.set({ 5025 state: globalThis.Checkout.SubmittingStates.DONE 5026 }); 5027 globalThis.Checkout.store.state.set(globalThis.Checkout.StoreStates.SUBMITTED); 5028 globalThis.CFDispatchEvent(globalThis.CFEvents.FORM_SUBMITTED_FINALIZED, payload); 5029 __privateMethod(this, _CheckoutSubmit_static, handleFormSubmitRedirect_fn).call(this, response, response.headers.get("Location")); 5030 } 5031 } else if (response.status >= 300 && response.status < 400) { 5032 globalThis.Checkout.store.submitting.set({ 5033 state: globalThis.Checkout.SubmittingStates.DONE 5034 }); 5035 globalThis.Checkout.store.state.set(globalThis.Checkout.StoreStates.SUBMITTED); 5036 globalThis.CFDispatchEvent(globalThis.CFEvents.FORM_SUBMITTED_FINALIZED, payload); 5037 __privateMethod(this, _CheckoutSubmit_static, handleFormSubmitRedirect_fn).call(this, response, response.headers.get("Location") ?? globalThis.location.href); 5038 } else if (response.status === 429) { 5039 clearInterval(timer); 5040 globalThis.Checkout.store.submitting.set({ 5041 state: globalThis.Checkout.SubmittingStates.ERROR, 5042 code: globalThis.Checkout.ErrorTypes.EXCEEDED_MAX_RETRIES 5043 }); 5044 } else { 5045 globalThis.Checkout.store.submitting.set({ 5046 state: globalThis.Checkout.SubmittingStates.ERROR, 5047 code: globalThis.Checkout.ErrorTypes.UNHANDLED_SERVER_RESPONSE 5048 }); 5049 } 5050 }).catch((err) => { 5051 console.error(err); 5052 clearInterval(timer); 5053 globalThis.Checkout.store.submitting.set({ 5054 state: globalThis.Checkout.SubmittingStates.ERROR, 5055 code: globalThis.Checkout.ErrorTypes.SERVER_ERROR 5056 }); 5057 }); 5058 } 5059}; 5060_redirecTo = new WeakMap(); 5061_threedsListenerEnabled = new WeakMap(); 5062_formSubmitPayload = new WeakMap(); 5063_CheckoutSubmit_static = new WeakSet(); 5064leadSourceGenerator_fn = function() { 5065 const DEFAULT_MAX_CHARS_LENGTH = 512; 5066 const leadQueryParamMapping = { 5067 utm_source: { 5068 name: "source" 5069 }, 5070 utm_medium: { 5071 name: "medium" 5072 }, 5073 utm_campaign: { 5074 name: "campaign" 5075 }, 5076 utm_term: { 5077 name: "term" 5078 },
5079 utm_content: { 5080 name: "content" 5081 }, 5082 affiliate: {}, 5083 subAffiliate: {}, 5084 clickId: {}, 5085 salesAgent: {} 5086 }; 5087 const params = new URLSearchParams(globalThis.location.search); 5088 return Array.from(params.keys()).reduce((acc, key) => { 5089 const mappedValue = leadQueryParamMapping[key]; 5090 if (mappedValue) { 5091 const paramValue = params.get(key); 5092 const leadSourceName = mappedValue.name ?? key; 5093 acc[leadSourceName] = paramValue.substring(0, DEFAULT_MAX_CHARS_LENGTH); 5094 } 5095 return acc; 5096 }, {}); 5097}; 5098submitRebilly_fn = function(onValidationError) { 5099 const paymentType = globalThis.Checkout.store.payment.type.get(); 5100 const method = REBILLY_PAYMENT_METHOD_BY_TYPE_MAP[paymentType] ?? paymentType; 5101 const Rebilly = globalThis.Rebilly; 5102 let extraData = { method }; 5103 const leadSource = __privateMethod(this, _CheckoutSubmit_static, leadSourceGenerator_fn).call(this); 5104 if (Object.keys(leadSource).length) { 5105 extraData = { ...extraData, leadSource }; 5106 } 5107 const form = document.querySelector("#cfAR"); 5108 const rebillyDataMapping = { 5109 firstName: "first_name", 5110 lastName: "last_name", 5111 emails: "email", 5112 ...paymentType === "Klarna" ? { country: "country" } : {} 5113 }; 5114 const rebillyFieldKeyMapping = { 5115 "paymentInstrument.cvv": "cvv" 5116 }; 5117 Object.entries(rebillyDataMapping).forEach(([rebillyKey, dataKey]) => { 5118 const input = form.querySelector(`[data-rebilly="${rebillyKey}"]`); 5119 if (input) { 5120 let value = globalThis.Checkout.store.contact.get()[dataKey]; 5121 if (dataKey === "country") { 5122 const cartHasPhysicalProducts = hasPhysicalProducts(globalThis.Checkout.computed.checkoutCart.get()); 5123 const billingSameAsShipping = globalThis.Checkout.store.billingSameAsShipping.get(); 5124 const key = cartHasPhysicalProducts && billingSameAsShipping ? "shipping" : "billing"; 5125 value = globalThis.Checkout.store[key].get()[dataKey] ?? globalThis.Checkout.contactLocale.country; 5126 } 5127 input.value = value; 5128 } 5129 }); 5130 globalThis.clearBlankInputFields(); 5131 return Rebilly.createToken(form, extraData).catch((e) => { 5132 console.error(e); 5133 if (e.invalidFields && e.invalidFields.length) { 5134 e.invalidFields.forEach((error) => { 5135 const key = rebillyFieldKeyMapping[error.field]; 5136 if (key) { 5137 const event = { valid: false, error: { message: error.message } }; 5138 globalThis.Checkout.store.payment["payment-card"].events.setKey(key, event); 5139 } 5140 }); 5141 globalThis.Checkout.store.submitting.set({ 5142 state: globalThis.Checkout.SubmittingStates.ERROR, 5143 code: globalThis.Checkout.ErrorTypes.REBILLY_ERROR 5144 }); 5145 } else { 5146 let message = e.message; 5147 if (e.details.length) { 5148 const details = e.details.join(" - "); 5149 message = `${message} - ${details}`; 5150 } 5151 globalThis.Checkout.store.submitting.set({ 5152 state: globalThis.Checkout.SubmittingStates.ERROR, 5153 code: globalThis.Checkout.ErrorTypes.REBILLY_ERROR, 5154 message 5155 }); 5156 } 5157 onValidationError(e); 5158 }); 5159}; 5160buildPaymentMethodDetails_fn = function() { 5161 const mode = globalThis.Checkout.store.checkout.mode.get(); 5162 if (mode == globalThis.Checkout.CheckoutStates.UPGRADE_DOWNGRADE) return; 5163 const payment_method_type = globalThis.Checkout.store.payment.type.get(); 5164 const rebilly_token = globalThis.Checkout.store.payment[payment_method_type].token.get(); 5165 const payment_method_id = globalThis.Checkout.store.payment.id.get(); 5166 if (payment_method_id) return { payment_method_id, rebilly_token: null }; 5167 return { 5168 payment_method_id: null, 5169 payment_method_type, 5170 rebilly_token 5171 }; 5172}; 5173buildRegistrationDetails_fn = function() { 5174 return { 5175 calendar_event_id: document.getElementsByName("registration[calendar_event_id]")[0].value, 5176 occurs_at: document.getElementsByName("registration[occurs_at]")[0].value 5177 }; 5178}; 5179shouldIncludeRegistration_fn = function() { 5180 return document.getElementsByName("registration[calendar_event_id]")?.length > 0; 5181}; 5182buildAddressParams_fn = function(addressParams, options) { 5183 const mode = globalThis.Checkout.store.checkout.mode.get(); 5184 const billing = addressParams.billingAddress ?? {}; 5185 const shipping = addressParams.shippingAddress ?? {}; 5186 const checkoutCart = globalThis.Checkout.computed.checkoutCart.get(); 5187 if (mode == globalThis.Checkout.CheckoutStates.UPGRADE_DOWNGRADE && !hasPhysicalProducts(checkoutCart)) { 5188 return; 5189 } 5190 let billing_address_attributes, physical_address_attributes; 5191 if (mode !== globalThis.Checkout.CheckoutStates.UPGRADE_DOWNGRADE) { 5192 if (isSavedAddress(billing)) { 5193 billing_address_attributes = { 5194 id: billing.id 5195 }; 5196 } else { 5197 billing_address_attributes = { 5198 address_one: billing.address, 5199 address_two: billing.address_2, 5200 city: billing.city, 5201 region_name: billing.state, 5202 country_id: billing.country, 5203 postal_code: billing.zip 5204 }; 5205 } 5206 } 5207 if (isSavedAddress(shipping)) { 5208 physical_address_attributes = { 5209 id: shipping.id 5210 }; 5211 } else { 5212 physical_address_attributes = { 5213 address_one: shipping.address, 5214 address_two: shipping.address_2, 5215 city: shipping.city, 5216 region_name: shipping.state, 5217 country_id: shipping.country, 5218 postal_code: shipping.zip 5219 }; 5220 } 5221 if (hasPhysicalProducts(checkoutCart)) { 5222 const billingSameAsShipping = globalThis.Checkout.store.billingSameAsShipping.get(); 5223 if (options.skipBillingAddress) { 5224 return { shipping: { shipping_addresses_attributes: [{ physical_address_attributes }] } }; 5225 } 5226 if (mode == globalThis.Checkout.CheckoutStates.OTO) { 5227 return { 5228 shipping: { shipping_addresses_attributes: [{ physical_address_attributes }] }, 5229 billing: { billing_address_attributes, billing_same_as_shipping: false } 5230 }; 5231 } 5232 if (billingSameAsShipping) { 5233 return { 5234 shipping: { shipping_addresses_attributes: [{ physical_address_attributes }] }, 5235 billing: { billing_same_as_shipping: true } 5236 }; 5237 } else { 5238 return { 5239 shipping: { shipping_addresses_attributes: [{ physical_address_attributes }] }, 5240 billing: { billing_address_attributes, billing_same_as_shipping: false } 5241 }; 5242 } 5243 } else { 5244 if (options.skipBillingAddress) return; 5245 return { billing: { billing_address_attributes } }; 5246 } 5247}; 5248submitOrderAsync_fn = async function(data, requestIdempotency, maxRetries = 3, onBeforeSubmit, onRetryAfter) { 5249 let response; 5250 for (let i = 0; i < maxRetries; i++) { 5251 onBeforeSubmit(); 5252 const nonce = await fetchCheckoutNonce(); 5253 response = await fetch(renderedHref(), { 5254 credentials: "same-origin", 5255 method: "post", 5256 body: JSON.stringify({ ...data, request_idempotency: requestIdempotency, ...checkoutNonceParams(nonce) }), 5257 headers: { 5258 "Content-Type": "application/json", 5259 "X-CF2-POST-TYPE": "submit" 5260 } 5261 }).then((res) => { 5262 if (res.status >= 500) { 5263 console.error(res); 5264 throw Error("500 error"); 5265 } 5266 return res; 5267 }); 5268 if (response.status === 429) { 5269 const sleepTime = parseInt(response.headers.get("Retry-After")); 5270 onRetryAfter(sleepTime); 5271 console.log(`Waiting on queue, retrying after ${sleepTime}`); 5272 await sleepMs(sleepTime); 5273 } else { 5274 break; 5275 } 5276 } 5277 return response; 5278}; 5279handleFormSubmitRedirect_fn = async function(response, urlToRedirect) { 5280 globalThis.location.href = urlToRedirect; 5281}; 5282add3dsListener_fn = function() { 5283 if (__privateGet(this, _threedsListenerEnabled)) return; 5284 __privateSet(this, _threedsListenerEnabled, true); 5285 globalThis.addEventListener("message", (event) => { 5286 if (event.data.sender == "CfOrderStatus") { 5287 const orderDetails = event.data.details; 5288 if (__privateGet(this, _redirecTo)) { 5289 orderDetails.redirect_to = __privateGet(this, _redirecTo); 5290 } 5291 fetch(renderedHref(), { 5292 credentials: "same-origin", 5293 method: "post", 5294 body: JSON.stringify(orderDetails), 5295 headers: { 5296 "Content-Type": "application/json", 5297 "X-CF2-POST-TYPE": "submit" 5298 } 5299 }).then((response) => { 5300 if (orderDetails["orderResult"] == "declined") { 5301 globalThis.Checkout.store.submitting.set({ 5302 state: globalThis.Checkout.SubmittingStates.ERROR, 5303 code: globalThis.Checkout.ErrorTypes.THREEDS_DECLINED_ERROR 5304 }); 5305 } else { 5306 if (response.ok) { 5307 globalThis.Checkout.store.state.set(globalThis.Checkout.StoreStates.SUBMITTED);
5308 globalThis.CFDispatchEvent(globalThis.CFEvents.FORM_SUBMITTED_FINALIZED, __privateGet(this, _formSubmitPayload)); 5309 __privateMethod(this, _CheckoutSubmit_static, handleFormSubmitRedirect_fn).call(this, response, response.headers.get("Location")); 5310 } else { 5311 response.json().then((r) => { 5312 globalThis.Checkout.store.submitting.set({ 5313 state: globalThis.Checkout.SubmittingStates.ERROR, 5314 code: globalThis.Checkout.ErrorTypes.THREEDS_DECLINED_CUSTOM_ERROR, 5315 message: r.error 5316 }); 5317 }); 5318 } 5319 } 5320 globalThis.Checkout.store.threeds.set({ 5321 show: false, 5322 approvalUrl: null 5323 }); 5324 }); 5325 } 5326 }); 5327}; 5328__privateAdd(CheckoutSubmit, _CheckoutSubmit_static); 5329__privateAdd(CheckoutSubmit, _redirecTo, document.querySelector('[href="#submit-checkout-form"]')?.getAttribute("data-on-submit-go-to")); 5330__privateAdd(CheckoutSubmit, _threedsListenerEnabled, false); 5331__privateAdd(CheckoutSubmit, _formSubmitPayload, null); 5332
5333// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-apple-pay-button-v1.ts 5334init_runtime(); 5335var CheckoutApplePayButtonV1 = class extends CF2Component { 5336 constructor(el, runtimeSel) { 5337 super(el, runtimeSel); 5338 } 5339 mount() { 5340 this.applePayMounted = nanostores.atom(false); 5341 const checkoutElement = this.element.closest(".elCheckout"); 5342 if (!!this.getApplePayPreview()) { 5343 this.getApplePayPreview().addEventListener("click", (evt) => { 5344 evt.preventDefault(); 5345 CheckoutSubmit.checkSubmitShowErrors({ onlyFields: /* @__PURE__ */ new Set(["products"]) }); 5346 CheckoutSubmit.checkSubmit(checkoutElement); 5347 }); 5348 new MutationObserver((mutations) => { 5349 for (const mutation of mutations) { 5350 for (const addedNode of mutation.addedNodes) { 5351 if (addedNode.id == "rebilly-apple-pay-button") { 5352 this.applePayMounted.set(true); 5353 } 5354 } 5355 for (const removedNode of mutation.removedNodes) { 5356 if (removedNode.id == "rebilly-apple-pay-button") { 5357 this.applePayMounted.set(false); 5358 } 5359 } 5360 } 5361 }).observe(this.element.querySelector(".apple-pay-button"), { 5362 subtree: true, 5363 childList: true 5364 }); 5365 const computedState = nanostores.computed([ 5366 Checkout.computed.isDigitalWalletReadyToStart, 5367 this.applePayMounted, 5368 Checkout.store.isUpdatingRebilly 5369 ], (isDigitalWalletReadyToStart, isMounted, isUpdatingRebilly) => { 5370 if (isUpdatingRebilly) { 5371 return "loading"; 5372 } else if (!isMounted || !isDigitalWalletReadyToStart) { 5373 return "preview"; 5374 } else { 5375 return "ready"; 5376 } 5377 }); 5378 computedState.subscribe((state) => { 5379 this.getApplePayWrapper() && (this.getApplePayWrapper().dataset.state = state); 5380 }); 5381 const computedShowApplePay = nanostores.computed([ 5382 Checkout.store.payment.id, 5383 Checkout.store.payment.type 5384 ], (paymentId, paymentType) => { 5385 return !paymentId && paymentType == "apple-pay" && this.mode != "upgradeDowngrade"; 5386 }); 5387 computedShowApplePay.subscribe((showApplePay) => { 5388 this.element.closest(".submit-button-wrapper")?.setAttribute("data-show-apple-pay", showApplePay); 5389 }); 5390 } 5391 } 5392 getApplePayWrapper() { 5393 return this.element.querySelector(".apple-pay-button-wrapper"); 5394 } 5395 getApplePayPreview() { 5396 return this.element.querySelector(".apple-pay-button-preview"); 5397 } 5398}; 5399registerComponent("CheckoutApplePayButton/V1", CheckoutApplePayButtonV1); 5400window["CheckoutApplePayButtonV1"] = CheckoutApplePayButtonV1; 5401
5402// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-submit-button-v1.ts 5403init_define_process(); 5404init_general(); 5405init_runtime(); 5406var CheckoutSubmitButtonV1 = class extends CF2Component { 5407 constructor(el, runtimeSel) { 5408 super(el, runtimeSel); 5409 } 5410 onSubmit(element) { 5411 } 5412 mount() { 5413 this.storeButtonInitialHTML(); 5414 this.getSubmitButton().addEventListener("click", (evt) => { 5415 evt.preventDefault(); 5416 this.requestSubmit(); 5417 }); 5418 const checkoutElement = this.element.closest(".elCheckout"); 5419 Checkout.store.state.listen((state) => { 5420 if (state === Checkout.StoreStates.INITIALIZED && !this.keydownListenerAttached) { 5421 this.keydownListenerAttached = true; 5422 document.addEventListener("keydown", (evt) => { 5423 if (evt.isComposing || evt.keyCode === 229) return; 5424 if (evt.keyCode === 13 && $(this.element).is(":visible")) { 5425 if (isElementVisibleOnViewport(checkoutElement, 20)) { 5426 this.element.focus(); 5427 this.requestSubmit(); 5428 } 5429 } 5430 }); 5431 } 5432 }); 5433 } 5434 // The single entry point for every submit trigger. The lock is taken 5435 // synchronously, before any await, so it covers the whole attempt -- the 5436 // validation, tokenization and nonce work that runs before the payment POST as 5437 // well as the POST itself. The Enter key comes through here too, since 5438 // `pointer-events: none` only stops pointer input. 5439 requestSubmit() { 5440 if (this.isSubmitLocked()) return; 5441 this.lockSubmit(); 5442 Promise.all(this.onSubmit(this.element) ?? []).finally(() => { 5443 if (!this.submitClaimed) this.unlockSubmit(); 5444 }); 5445 } 5446 isSubmitLocked() { 5447 return this.getSubmitButton().getAttribute("data-disabled") === "true"; 5448 } 5449 // aria-disabled rides along because the button is an anchor: `pointer-events: none` 5450 // takes it out of the pointer flow but says nothing to a screen reader. 5451 lockSubmit() { 5452 this.getSubmitButton().setAttribute("data-disabled", true); 5453 this.getSubmitButton().setAttribute("aria-disabled", true); 5454 } 5455 unlockSubmit() { 5456 this.getSubmitButton().setAttribute("data-disabled", false); 5457 this.getSubmitButton().removeAttribute("aria-disabled"); 5458 } 5459 // Locks the button on behalf of a gateway. Also covers submits that never 5460 // touched this button -- express/wallet payments, the OTO one-click flow -- 5461 // which would otherwise leave it live while a payment is running. 5462 claimSubmit() { 5463 this.submitClaimed = true; 5464 this.lockSubmit(); 5465 } 5466 getSubmitButton() { 5467 return this.element.querySelector('[href="#submit-checkout-form"]'); 5468 } 5469 storeButtonInitialHTML() { 5470 const buttonMainText = this.element.querySelector(".elButtonMain .elButtonMainText"); 5471 const buttonSubText = this.element.querySelector(".elButtonSub"); 5472 this.buttonMainTextInitialHTML = buttonMainText.innerHTML; 5473 this.buttonSubTextInitialHTML = buttonSubText.innerHTML; 5474 } 5475 // The gateways' "back to idle" call, and so also the only thing that releases 5476 // the submit lock. Callers must not use it to refresh the label while a submit 5477 // is in flight. 5478 setButtonInitialHTML() { 5479 this.submitClaimed = false; 5480 this.unlockSubmit(); 5481 this.element.removeAttribute("data-loading"); 5482 const buttonMain = this.element.querySelector(".elButtonMain"); 5483 const buttonSub = this.element.querySelector(".elButtonSub"); 5484 buttonMain.querySelector(".elButtonSpinner").style.removeProperty("display"); 5485 const buttonMainText = buttonMain.querySelector(".elButtonMainText"); 5486 buttonMainText.innerHTML = this.buttonMainTextInitialHTML; 5487 buttonSub.innerHTML = this.buttonSubTextInitialHTML; 5488 } 5489 setLoading() { 5490 this.element.setAttribute("data-loading", "true"); 5491 } 5492 setSubmittingText() { 5493 this.claimSubmit(); 5494 this.element.removeAttribute("data-loading"); 5495 const buttonMain = this.element.querySelector(".elButtonMain"); 5496 const buttonSub = this.element.querySelector(".elButtonSub"); 5497 buttonMain.querySelector(".elButtonSpinner").style.display = "inline-block"; 5498 const buttonMainText = buttonMain.querySelector(".elButtonMainText"); 5499 buttonMainText.innerHTML = this.submittingText; 5500 buttonSub.innerHTML = ""; 5501 } 5502 update({ text, subText }) { 5503 this.element.removeAttribute("data-loading"); 5504 const buttonMain = this.element.querySelector(".elButtonMain"); 5505 const buttonSub = this.element.querySelector(".elButtonSub"); 5506 const buttonMainText = buttonMain.querySelector(".elButtonMainText"); 5507 buttonMainText.textContent = text; 5508 buttonSub.textContent = subText; 5509 } 5510}; 5511registerComponent("CheckoutSubmitButton/V1", CheckoutSubmitButtonV1); 5512window["CheckoutSubmitButtonV1"] = CheckoutSubmitButtonV1; 5513
5514// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-configuration-error-v1.ts 5515init_define_process(); 5516init_runtime(); 5517var CheckoutConfigurationErrorV1 = class extends CF2Component { 5518 constructor(el, runtimeSel) { 5519 super(el, runtimeSel); 5520 __publicField(this, "errorMessageMapping", { 5521 [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>`, 5522 [ERROR_CODES.EMPTY_PRODUCTS_ERROR]: this.checkoutConfigurationErrorsTexts.emptyProductsError, 5523 [ERROR_CODES.ORDER_RECURRING_INTERVAL_MISMATCH]: this.checkoutConfigurationErrorsTexts.orderRecurringIntervalMismatchError, 5524 [ERROR_CODES.MULTIPLE_CHECKOUT_PRESENT]: this.checkoutConfigurationErrorsTexts.multipleCheckoutPresentError 5525 }); 5526 } 5527 mount() { 5528 const prettifyErrorMessage = (error) => { 5529 if (this.errorMessageMapping[error.code]) return this.errorMessageMapping[error.code]; 5530 if (error.fetchErrorType == CFFetcherErrorTypes.NETWORK_ERROR) { 5531 return `${this.checkoutConfigurationErrorsTexts.networkError} ${error.code}`; 5532 } else { 5533 return `${this.checkoutConfigurationErrorsTexts.criticalServerError} ${error.code}`; 5534 } 5535 }; 5536 Checkout.store?.criticalErrors?.subscribe((errors) => { 5537 this.errors = errors.map(prettifyErrorMessage); 5538 this.render(); 5539 }); 5540 } 5541 setErrors(errors) { 5542 if (errors === null || typeof errors === "undefined") { 5543 return; 5544 } 5545 this.errors = Array.isArray(errors) ? errors : [errors]; 5546 this.render(); 5547 } 5548 remove() { 5549 this.element.innerHTML = ""; 5550 } 5551 render(initializeChildrenInstances = false) { 5552 const is_server = true; 5553 const errors = this.errors ?? []; 5554 const checkoutConfigurationErrorsTexts = this.checkoutConfigurationErrorsTexts ?? null; 5555 let html = ""; 5556 { 5557 html += `<div class="elCheckoutConfigError`; 5558 if (errors?.length == 0) { 5559 html += ` elHide`; 5560 } 5561 html += `">`; 5562 const c0 = errors; 5563 const fl1 = new CF2ForloopDrop(c0.length); 5564 for (const error of c0) { 5565 const forloop = fl1; 5566 html += `<span>${error}</span>`; 5567 forloop.next(); 5568 } 5569 html += `</div>`; 5570 } 5571 this.replaceContent(html); 5572 if (initializeChildrenInstances) { 5573 const scopeToYggRender = this.element.querySelectorAll("[ygg-render]").length > 0; 5574 const options = { scopeToYggRender }; 5575 CF2Component.hydrateTree(this.element, options); 5576 } 5577 } 5578}; 5579registerComponent("CheckoutConfigurationError/V1", CheckoutConfigurationErrorV1); 5580window["CheckoutConfigurationErrorV1"] = CheckoutConfigurationErrorV1; 5581
5582// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-order-details-content-v1.ts 5583init_define_process(); 5584init_runtime(); 5585var CheckoutOrderDetailsContentV1 = class extends CF2Component { 5586 constructor(el, runtimeSel) { 5587 super(el, runtimeSel); 5588 __publicField(this, "undefined"); 5589 } 5590 remove() { 5591 this.element.innerHTML = ""; 5592 } 5593 render(initializeChildrenInstances = false) { 5594 const is_server = true; 5595 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" }] }; 5596 let html = ""; 5597 { 5598 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>`; 5599 if (order_details?.name) { 5600 html += `<span class="elCheckoutOrderDetailsName">${order_details?.name}</span>`; 5601 } 5602 html += `<span class="elCheckoutOrderDetailsDate">${order_details?.created_at}</span></div><div class="elCheckoutOrderDetailsItemsWrapper elCheckoutOrderDetailsWrapper"><h3></h3><div class="elCheckoutOrderDetailsItems elCheckoutOrderDetailsContainer">`; 5603 const c0 = order_details.line_items; 5604 const fl1 = new CF2ForloopDrop(c0.length); 5605 for (const line_item of c0) { 5606 const forloop = fl1; 5607 html += `<div class="elCheckoutOrderDetailsItem">`; 5608 const imageUrl = line_item?.image; 5609 if (imageUrl) { 5610 html += `<div class="elCheckoutOrderDetailsItemImage"><div data-page-element="Image/V2" class="elImageWrapper de-image-block id-Image/V2`; 5611 if (CF2Blank(imageUrl) && CF2Blank(null) && true) { 5612 html += ` forceHide`; 5613 } 5614 html += `" data-liquid-replace="item">`; 5615 if (imageUrl || !CF2Blank(null)) { 5616 html += `<img class="elImage" src="${imageUrl ?? null}" data-lazy-loading="true" data-lazy-loading="true"/>`; 5617 } else if (false) { 5618 html += `<div class="image-placeholder" title=""><span class="image-placeholder-header"></span></div>`; 5619 } 5620 html += `</div><div class="elCheckoutOrderDetailsItemQty">${line_item?.quantity}</div></div>`; 5621 } 5622 html += `<div class="elCheckoutOrderDetailsItemInfo"><span class="elCheckoutOrderDetailsItemName">${line_item?.product_name}</span>`; 5623 if (line_item?.display_price) { 5624 html += `<span class="elCheckoutOrderDetailsItemPrice">${line_item?.display_price}</span>`; 5625 } 5626 if (line_item?.variant_properties_values?.length > 0) { 5627 html += `<div class="elCheckoutOrderDetailsVariants">`; 5628 const c2 = line_item.variant_properties_values; 5629 const fl3 = new CF2ForloopDrop(c2.length); 5630 for (const variant_item of c2) { 5631 const forloop2 = fl3; 5632 html += `<span>${variant_item?.value}</span>`; 5633 forloop2.next(); 5634 } 5635 html += `</div>`; 5636 } 5637 html += `</div><div class="elCheckoutOrderDetailsItemAmount"><span>${line_item?.amount}</span></div></div>`; 5638 forloop.next(); 5639 } 5640 html += `</div></div>`; 5641 if (order_details?.shipping_address) { 5642 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>`; 5643 } 5644 if (order_details?.billing_address) { 5645 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>`; 5646 } 5647 if (order_details?.billing_payment_method) { 5648 html += `<div class="elCheckoutOrderDetailsPayment elCheckoutOrderDetailsWrapper"><h3></h3>`; 5649 if (order_details?.billing_payment_method?.type == "payment-card") { 5650 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>`; 5651 } else if (order_details?.billing_payment_method?.type == "paypal") { 5652 html += `<div class="elCheckoutOrderDetailsPaymentType"><div class="elCheckoutOrderDetailsContainer"><i class="fab fa-paypal"></i><span>${order_details?.billing_payment_method?.details}</span></div></div>`; 5653 } 5654 html += `</div>`; 5655 } 5656 html += `<div class="elCheckoutOrderDetailsSummaryWrapper elCheckoutOrderDetailsWrapper"><h3></h3>
5656<div class="elCheckoutOrderDetailsSummary elCheckoutOrderDetailsContainer">`; 5657 if (order_details?.tax_amount) { 5658 html += `<div class="elCheckoutOrderDetailsSummaryTax"><span></span><span>${order_details?.tax_amount}</span></div>`; 5659 } 5660 if (order_details?.shipping_amount) { 5661 html += `<div class="elCheckoutOrderDetailsSummaryShipping"><span></span><span>${order_details?.shipping_amount}</span></div>`; 5662 } 5663 html += `<div class="elCheckoutOrderDetailsSummaryTotal"><span></span><span>${order_details?.total_amount}</span></div></div></div>`; 5664 } 5665 this.replaceContent(html); 5666 if (initializeChildrenInstances) { 5667 const scopeToYggRender = this.element.querySelectorAll("[ygg-render]").length > 0; 5668 const options = { scopeToYggRender }; 5669 CF2Component.hydrateTree(this.element, options); 5670 } 5671 } 5672}; 5673registerComponent("CheckoutOrderDetailsContent/V1", CheckoutOrderDetailsContentV1); 5674window["CheckoutOrderDetailsContentV1"] = CheckoutOrderDetailsContentV1; 5675
5676// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-order-details-v1.ts 5677init_define_process(); 5678init_modal_v1(); 5679
5680// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-existing-orders.ts 5681init_define_process(); 5682
5683// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Utils/api.ts 5684init_define_process(); 5685init_fetcher(); 5686function makeCurrentPageFetcher(options) { 5687 const { headers, ...requestOptions } = options ?? {}; 5688 const fetcher = new Fetcher({ 5689 debug: true, 5690 pathPrefix: window.location.origin + renderedPath(), 5691 headers: { 5692 Accept: "application/json", 5693 "Content-Type": "application/json", 5694 ...headers ?? {} 5695 }, 5696 requestOptions: { 5697 retries: 3, 5698 timeoutMS: 3e4, 5699 timeoutAfterRetrial: 1e3, 5700 convertThrowToErrorResponse: true, 5701 onlyOneInflightRequest: true, 5702 ...requestOptions 5703 } 5704 }); 5705 return fetcher; 5706} 5707
5708// projects/lib/packages/yggdrasil-blueprints/src/Elements/Checkout/V2/Services/checkout-existing-orders.ts 5709var REACTAVATABLE_SERVICE_STATUS = ["canceled", "churned"]; 5710var existingOrderFetcher = makeCurrentPageFetcher({ 5711 customEvent: "CF2:ExistingOrder", 5712 shouldCaptureServerError: true, 5713 convertThrowToErrorResponse: false 5714}); 5715var _hasReactivatableItems, _hasUpgradeDowngradeItems, _productCardDetails, _productCardDetailsObj; 5716var CheckoutExistingOrders = class { 5717 static fetch(payload = {}) { 5718 if (globalThis.globalResourceData.resourceName == "checkout") return Promise.resolve(); 5719 const manage_order_id = new URLSearchParams(window.location.search).get("manage_order_id"); 5720 return existingOrderFetcher.get("/existing_orders", { manage_order_id, ...payload }).then((data) => { 5721 this.cleanUp(); 5722 this.processExistingOrdersResponse(data); 5723 }).catch((e) => { 5724 throw new CheckoutCriticalError(ERROR_CODES.FETCH_EXISTING_ORDERS_ERROR, { 5725 cause: e 5726 }); 5727 }); 5728 } 5729 static cleanUp() { 5730 __privateSet(this, _hasReactivatableItems, false); 5731 __privateSet(this, _hasUpgradeDowngradeItems, false); 5732 this.orderDetailsByOrderId = {}; 5733 __privateSet(this, _productCardDetails, {}); 5734 __privateSet(this, _productCardDetailsObj, {}); 5735 } 5736 static clearUpdatableOrders(selectedProductId) { 5737 if (anyUpdatableOrders()) { 5738 globalThis.globalResourceData.products?.forEach(({ id: productId }) => { 5739 const isSelected = selectedProductId == productId; 5740 updateCardByProductIdState(productId, { 5741 quantity: isSelected ? 1 : 0, 5742 renderType: void 0, 5743 selectedOrderIndex: void 0, 5744 selectedUpdatableCartItemIndex: void 0, 5745 updatableOrders: void 0, 5746 cartItemOrderId: void 0, 5747 cartItemLineItemId: void 0, 5748 cartItemRenderType: void 0 5749 }); 5750 }); 5751 this.cleanUp(); 5752 } 5753 } 5754 static processExistingOrdersResponse(existingOrdersResponse) { 5755 existingOrdersResponse.orders.forEach((order) => { 5756 const orderId = order.id; 5757 this.orderDetailsByOrderId[orderId] = order; 5758 const orderNumber = order.order_number; 5759 order.line_items.forEach((lineItem) => { 5760 const productId = lineItem.product_id; 5761 const lineItemSubscriptionDetails = lineItem.subscription_details; 5762 if (REACTAVATABLE_SERVICE_STATUS.includes(lineItemSubscriptionDetails?.status) && lineItemSubscriptionDetails?.reactivatable) { 5763 this.processReactivation(lineItem, orderId, orderNumber, productId); 5764 } else { 5765 this.processUpgradeDowngrades(lineItem, orderId, orderNumber, productId); 5766 } 5767 }); 5768 }); 5769 if (__privateGet(this, _hasReactivatableItems) || __privateGet(this, _hasUpgradeDowngradeItems)) { 5770 this.processUpdatableObj(); 5771 this.updateSelectedCardItem(); 5772 } 5773 } 5774 static processUpdatableObj() { 5775 __privateSet(this, _productCardDetails, {}); 5776 Object.keys(__privateGet(this, _productCardDetailsObj)).forEach((k) => { 5777 __privateGet(this, _productCardDetails)[k] = { 5778 updatableOrders: Object.values(__privateGet(this, _productCardDetailsObj)[k].updatableOrders).reverse() 5779 }; 5780 }); 5781 } 5782 static processReactivation(lineItem, orderId, orderNumber, productId) { 5783 const lineItemId = lineItem.id; 5784 const variantId = lineItem.variant_id; 5785 const priceId = lineItem.price_id; 5786 if (!globalThis.Checkout.variantsById[variantId] || !globalThis.Checkout.pricesById[priceId]) { 5787 return; 5788 } 5789 __privateSet(this, _hasReactivatableItems, true); 5790 this.storeProductCardDetails( 5791 globalThis.Checkout.CheckoutStates.REACTIVATE, 5792 orderId, 5793 orderNumber, 5794 lineItemId, 5795 productId, 5796 variantId, 5797 priceId 5798 ); 5799 } 5800 static processUpgradeDowngrades(lineItem, orderId, orderNumber, productId) { 5801 const lineItemId = lineItem.id; 5802 lineItem.upgrade_downgrade_options.forEach((upgradeDowngrade) => { 5803 const variantId = upgradeDowngrade.variant_to_id; 5804 const priceId = upgradeDowngrade.price_to_id; 5805 if (!globalThis.Checkout.variantsById[variantId] || !globalThis.Checkout.pricesById[priceId]) { 5806 return; 5807 } 5808 __privateSet(this, _hasUpgradeDowngradeItems, true);
5809 this.storeProductCardDetails( 5810 globalThis.Checkout.CheckoutStates.UPGRADE_DOWNGRADE, 5811 orderId, 5812 orderNumber, 5813 lineItemId, 5814 productId, 5815 variantId, 5816 priceId, 5817 upgradeDowngrade.direction 5818 ); 5819 }); 5820 } 5821 static storeProductCardDetails(type, orderId, orderNumber, lineItemId, productId, variantId, priceId, direction) { 5822 __privateGet(this, _productCardDetailsObj)[productId] = __privateGet(this, _productCardDetailsObj)[productId] ?? { 5823 updatableOrders: {} 5824 }; 5825 const updatableOrders = __privateGet(this, _productCardDetailsObj)[productId].updatableOrders; 5826 updatableOrders[orderId] = updatableOrders[orderId] ?? { 5827 type, 5828 id: orderId, 5829 number: orderNumber, 5830 updatableItems: [] 5831 }; 5832 const { name: variantName } = globalThis.Checkout.variantsById[variantId]; 5833 const { name: priceName } = globalThis.Checkout.pricesById[priceId]; 5834 const updatableItems = updatableOrders[orderId].updatableItems; 5835 updatableItems.push({ 5836 variantName, 5837 priceName, 5838 direction: direction ? direction?.charAt(0).toUpperCase() + direction?.slice(1) : null, 5839 cardDetails: { 5840 variantId, 5841 priceId, 5842 // NOTE: We disable orderId and lineItemId for reactivations until we can perform reactivations 5843 // on the same order as currently we create a new order when that happens 5844 ...type == globalThis.Checkout.CheckoutStates.UPGRADE_DOWNGRADE ? { 5845 orderId, 5846 lineItemId 5847 } : {} 5848 } 5849 }); 5850 } 5851 static updateSelectedCardItem() { 5852 let selectedCartItemDetail; 5853 globalThis.Checkout.computed.checkoutCart.get().items.find(({ product_id, variant_id, price_id }) => { 5854 const cardDetails = __privateGet(this, _productCardDetails)[product_id]?.updatableOrders[0].updatableItems[0].cardDetails; 5855 if (!globalThis.Checkout.productsById[product_id].bump && __privateGet(this, _productCardDetails)[product_id]) { 5856 selectedCartItemDetail = {}; 5857 selectedCartItemDetail.variantId = cardDetails?.variantId ?? variant_id; 5858 selectedCartItemDetail.priceId = cardDetails?.priceId ?? price_id; 5859 selectedCartItemDetail.productId = product_id; 5860 return true; 5861 } 5862 }); 5863 if (!selectedCartItemDetail) { 5864 selectedCartItemDetail = {}; 5865 const product = globalThis.Checkout.products.filter((p) => !p.bump)[0]; 5866 const cardDetails = __privateGet(this, _productCardDetails)[product.id]?.updatableOrders[0].updatableItems[0].cardDetails; 5867 const variant = product.variants[0]; 5868 const price = variant.prices[0]; 5869 selectedCartItemDetail.variantId = cardDetails?.variantId ?? Number(variant.id); 5870 selectedCartItemDetail.priceId = cardDetails?.priceId ?? Number(price.id); 5871 selectedCartItemDetail.productId = product.id; 5872 } 5873 globalThis.globalResourceData.products?.forEach(({ id: productId }) => { 5874 const hasUpdatablePccState = !!__privateGet(this, _productCardDetails)[productId]; 5875 if (hasUpdatablePccState) { 5876 const order = __privateGet(this, _productCardDetails)[productId].updatableOrders[0]; 5877 const cartItem = order.updatableItems[0].cardDetails; 5878 const updatablePccState = __privateGet(this, _productCardDetails)[productId] ?? {}; 5879 updatablePccState.selectedOrderIndex = 0; 5880 updatablePccState.selectedUpdatableCartItemIndex = 0; 5881 updatablePccState.cartItemOrderId = cartItem.orderId; 5882 updatablePccState.cartItemLineItemId = cartItem.lineItemId; 5883 updatablePccState.cartItemRenderType = updatablePccState.renderType = order.type; 5884 updatablePccState.variantId = cartItem.variantId; 5885 updatablePccState.priceId = cartItem.priceId; 5886 const isProductInCart = selectedCartItemDetail.productId == productId; 5887 if (isProductInCart) { 5888 updatablePccState.variantId = selectedCartItemDetail.variantId; 5889 updatablePccState.priceId = selectedCartItemDetail.priceId; 5890 updatablePccState.quantity = 1; 5891 } 5892 const compositeKeys = getCompositeKeysForProduct(String(productId)); 5893 updateCardByProductIdState(productId, { 5894 ...updatablePccState, 5895 ...compositeKeys.length > 0 ? { quantity: 0 } : {} 5896 }); 5897 for (const compositeKey of compositeKeys) { 5898 const variantId = compositeKey.split(":")[1]; 5899 const matchingItem = order.updatableItems.find((item) =>
5899 String(item.cardDetails.variantId) == variantId); 5900 if (matchingItem) { 5901 updateCardByProductIdState(compositeKey, { 5902 updatableOrders: updatablePccState.updatableOrders, 5903 renderType: order.type, 5904 individualDirection: matchingItem.direction, 5905 selectedOrderIndex: 0, 5906 selectedUpdatableCartItemIndex: 0, 5907 cartItemRenderType: order.type, 5908 cartItemOrderId: matchingItem.cardDetails.orderId, 5909 cartItemLineItemId: matchingItem.cardDetails.lineItemId, 5910 variantId: matchingItem.cardDetails.variantId, 5911 priceId: matchingItem.cardDetails.priceId, 5912 quantity: isProductInCart && String(selectedCartItemDetail.variantId) == variantId ? 1 : 0 5913 }); 5914 } else { 5915 const fullOrder = this.orderDetailsByOrderId[order.id]; 5916 const isCurrentVariant = fullOrder?.line_items?.some( 5917 (li) => String(li.variant_id) == variantId && String(li.product_id) == String(productId) 5918 ); 5919 if (isCurrentVariant) { 5920 updateCardByProductIdState(compositeKey, { 5921 updatableOrders: updatablePccState.updatableOrders, 5922 renderType: order.type, 5923 individualDirection: "current", 5924 selectedOrderIndex: -1, 5925 cartItemRenderType: void 0, 5926 cartItemOrderId: void 0, 5927 cartItemLineItemId: void 0 5928 }); 5929 } 5930 } 5931 } 5932 } else { 5933 updateCardByProductIdState(productId, { selectType: "single" }); 5934 } 5935 }); 5936 } 5937}; 5938_hasReactivatableItems = new WeakMap(); 5939_hasUpgradeDowngradeItems = new WeakMap(); 5940_productCardDetails = new WeakMap(); 5941_productCardDetailsObj = new WeakMap(); 5942__privateAdd(CheckoutExistingOrders, _hasReactivatableItems, false); 5943__privateAdd(CheckoutExistingOrders, _hasUpgradeDowngradeItems, false); 5944__privateAdd(CheckoutExistingOrders, _productCardDetails, {}); 5945__privateAdd(CheckoutExistingOrders, _productCardDetailsObj, {}); 5946__publicField(CheckoutExistingOrders, "orderDetailsByOrderId", {}); 5947
5948// projects/lib/packages/yggdrasil-blueprints/__generated__/blueprints/checkout-order-details-v1.ts 5949init_runtime(); 5950var CheckoutOrderDetailsV1 = class extends CF2Component { 5951 constructor(el, runtimeSel) { 5952 super(el, runtimeSel); 5953 } 5954 mount() { 5955 this.getCloseButton().addEventListener("click", (evt) => { 5956 evt.preventDefault(); 5957 Checkout.store.selectedOrderDetailId.set(null); 5958 }); 5959 this.getModal().onClose = () => { 5960 Checkout.store.selectedOrderDetailId.set(null); 5961 }; 5962 Checkout.store.selectedOrderDetailId.listen((selectedOrderDetailId) => { 5963 if (selectedOrderDetailId) { 5964 this.showModal(); 5965 this.getContent().order_details = CheckoutExistingOrders.orderDetailsByOrderId[selectedOrderDetailId]; 5966 const orderDetails = this.getContent().order_details; 5967 this.formatOrderDetails(orderDetails); 5968 this.getContent().render(); 5969 } else { 5970 this.hideModal(); 5971 } 5972 }); 5973 } 5974 addressToString(address) { 5975 let str = ""; 5976 if (address.street_one) { 5977 str = address.street_one; 5978 if (address.street_two) { 5979 str += `, ${address.street_two}`; 5980 } 5981 if (address.city) { 5982 str += `. ${address.city}`; 5983 } 5984 if (address.region) { 5985 str += `, ${address.region}`; 5986 } 5987 if (address.postal_code) { 5988 str += ` ${address.postal_code}`; 5989 } 5990 if (address.country) { 5991 str += `, ${address.country}`; 5992 } 5993 } else { 5994 if (address.postal_code) { 5995 str += `${address.postal_code}, `; 5996 } 5997 if (address.country) { 5998 str += `${address.country}`; 5999 } 6000 } 6001 return str; 6002 } 6003 formatOrderDetails(orderDetails) { 6004 orderDetails.created_at = new Date(orderDetails.created_at_epoch * 1e3).toLocaleString(navigator.language); 6005 if (orderDetails.shipping_address) { 6006 orderDetails.shipping_address = this.addressToString(orderDetails.shipping_address); 6007 } 6008 if (orderDetails.billing_address) { 6009 orderDetails.billing_address = this.addressToString(orderDetails.billing_address); 6010 } 6011 if (orderDetails.line_items.length) { 6012 this.findAndAddProductsImage(orderDetails.line_items); 6013 } 6014 } 6015 getContent() { 6016 return this.getComponent("CheckoutOrderDetailsContent/V1"); 6017 } 6018 getModal() { 6019 return this.getComponent("Modal/V1"); 6020 } 6021 getCloseButton() { 6022 return this.getModal().element.querySelector(".elCheckoutModalFormClose"); 6023 } 6024 showModal() { 6025 this.getModal().element.style.display = "flex"; 6026 } 6027 hideModal() { 6028 this.getModal().element.style.display = "none"; 6029 } 6030 findAndAddProductsImage(lineItems) { 6031 lineItems.forEach((lineItem) => { 6032 lineItem.image = Checkout.variantsById[lineItem.variant_id].image ?? Checkout.productsById[lineItem.product_id].image; 6033 }); 6034 } 6035}; 6036registerComponent("CheckoutOrderDetails/V1", CheckoutOrderDetailsV1); 6037window["CheckoutOrderDetailsV1"] = CheckoutOrderDetailsV1; 6038 6039export { 6040 CheckoutTosV1, 6041 CheckoutMultiStepV2, 6042 hasPhysicalProducts, 6043 setupOrderSummaries, 6044 scrollToFirstVisibleError, 6045 checkValidCustomFields, 6046 buildCustomFields, 6047 collectLeads, 6048 AVAILABLE_KLARNA_COUNTRIES, 6049 numberOfStepsInCheckout, 6050 updateCardByProductIdState, 6051 unselectAllProducts, 6052 initIndividualVariantState, 6053 buildProductSelectBatched, 6054 CheckoutShippingProfileSelectV1, 6055 CheckoutLoadingV1, 6056 CheckoutSubmitNotificationV1, 6057 renderedHref, 6058 backfillAddressesId, 6059 isSavedAddress, 6060 fieldsForCountry, 6061 addressToString, 6062 parseAddressByFields, 6063 normalizeServerCheckoutError, 6064 serverCheckoutErrorMessage, 6065 isActionableCheckoutError, 6066 CheckoutCriticalError, 6067 ERROR_CODES, 6068 displayAndLogCriticalError, 6069 resolveInitialPaymentType, 6070 PaypalStates, 6071 ErrorTypes, 6072 hasUpgradeDowngradeItems, 6073 getStripeMode, 6074 getCartEstimatedTotal, 6075 convertToStripeAddress, 6076 convertAddressFromStripe, 6077 convertAddressFromSession, 6078 calculateStripeLineItems, 6079 STRIPE_SKIP_SHIPPING_ID, 6080 calculateStripeChangeResolveDetails, 6081 parseCssVars, 6082 hasErrors, 6083 productErrors, 6084 shippingOptionErrors, 6085 tosErrors, 6086 addressErrors, 6087 contactErrors, 6088 encodeVirtualInstallmentId, 6089 decodeVirtualInstallmentId, 6090 create, 6091 buildComputed, 6092 initializeUtilities, 6093 CheckoutSubmit, 6094 CheckoutSubmitButtonV1, 6095 CheckoutConfigurationErrorV1, 6096 makeCurrentPageFetcher, 6097 CheckoutExistingOrders 6098}; 6099//# sourceMappingURL=chunk-5JJNRIKL.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.