PageSourceSearch

https://www.shilav.co.il/cdn/shop/t/230/assets/boa-registry-product-card.js?v=101026547176831074761787057918

js shilav.co.il collected 2026-10-02 19:24:42 UTC 32,671 bytes, 2 lines download raw bytes

1import{openConfirmDialog}from"//www.shilav.co.il/cdn/shop/t/230/assets/boa-confirm-dialog.js?v=131460502620479553381782223888";import{createStore,debounce}from"//www.shilav.co.il/cdn/shop/t/230/assets/boa-state-store.js?v=48564391231922692681782223887";import{getCart}from"//www.shilav.co.il/cdn/shop/t/230/assets/cart.js?v=143387519737354811531785932281";import{EVENTS,publish}from"@archetype-themes/utils/pubsub";import{fetchGridBundleRegistryPresentation,fetchRegistryBundleLineDisplayProduct,fetchRegistryVariantStorefrontContext,fetchVariantAjaxJson,hydrateGridBundlePresentationLines,isStorefrontRegistryConfigured,shopifyStorefrontRoot}from"//www.shilav.co.il/cdn/shop/t/230/assets/boa-registry-storefront-bundle.js?v=85623480453958863651782885501";const DEBOUNCE_DELAY=800,DEFAULT_VARIANT_TITLE="Default Title",REGISTRY_ADD_BTN_SLOT_ONLY_CLASS="registry-card__add-btn_slot-only",GRID_BUNDLE_BUILDER="grid_bundle",REGISTRY_GRID_BUNDLE_THUMB=48,REGISTRY_BUNDLE_LINE_ROW_TEMPLATE_ID="RegistryBundleLineRow",guestCardAddQtyStoreByCard=new WeakMap;function handleFromProductUrl(url){const urlString=String(url||"").trim();if(!urlString)return"";try{const handleMatch=(urlString.startsWith("http")?new URL(urlString).pathname:urlString).match(/\/products\/([^/?#]+)/);return handleMatch?decodeURIComponent(handleMatch[1]):""}catch{return""}}function resolveRegistryProductHandle(item){const direct=String(item?.product?.handle??item?.product?.productHandle??"").trim();return direct||handleFromProductUrl(item?.product?.url??item?.product?.onlineStoreUrl)}function applyRegistryStockUi(cardElements,available){const{card,outOfStockEl,actionsExtra,actions,addToCartBtn,quantitySelector,qtyActionsRow}=cardElements;if(outOfStockEl.hidden=available,actionsExtra.hidden=available,actions&&card?.dataset.registryMode==="management"&&(actions.hidden=!1),card&&(card.dataset.registryOutOfStock=available?"false":"true"),!(card?.dataset.registryMode==="management"||!addToCartBtn)){if(!available){addToCartBtn.hidden=!0,quantitySelector&&(quantitySelector.hidden=!0),qtyActionsRow&&(qtyActionsRow.hidden=!0);return}addToCartBtn.hidden=!1,quantitySelector&&(quantitySelector.hidden=!1),qtyActionsRow&&(qtyActionsRow.hidden=!1)}}async function applyAvailabilityFromAjaxVariantJson(cardElements,variantId){const data=await fetchVariantAjaxJson(variantId);data&&typeof data.available=="boolean"&&applyRegistryStockUi(cardElements,data.available)}async function applyAvailabilityFromAjaxProductJson(cardElements,handle,variantId){const productHandle=String(handle||"").trim(),variantNumericId=Number(variantId);if(!productHandle||!Number.isFinite(variantNumericId))return;const root=shopifyStorefrontRoot();try{const res=await fetch(`${root}products/${encodeURIComponent(productHandle)}.js`);if(!res.ok)return;const productJson=await res.json(),matchedVariant=productJson?.variants?.find(variant=>Number(variant.id)===variantNumericId),isAvailable=matchedVariant?!!matchedVariant.available:!!productJson?.available;applyRegistryStockUi(cardElements,isAvailable)}catch{}}function sumRegistryCartQty(cart,registryId,variantId){if(!cart?.items?.length)return 0;const variantNumericId=Number(variantId),registryIdString=String(registryId);let sum=0;for(const item of cart.items){if(Number(item.variant_id)!==variantNumericId)continue;const lineProperties=item.properties||{};String(lineProperties._registry??"")===registryIdString&&(sum+=Number(item.quantity)||0)}return sum}export function buildRegistryScopedCartQuantityByVariantId(cart,registryId){const map={};if(!cart?.items?.length)return map;const registryIdString=String(registryId);for(const item of cart.items){const lineProperties=item.properties||{};if(String(lineProperties._registry??"")!==registryIdString)continue;const variantIdString=String(item.variant_id);map[variantIdString]=(map[variantIdString]||0)+(Number(item.quantity)||0)}return map}function minRegistryScopedBundleCompletes(cart,registryId,bundleId,childVariantIds){if(!cart?.items?.length||!bundleId||!childVariantIds?.length)return 0;const registryIdString=String(registryId),bundleIdString=String(bundleId);let min=1/0;for(const childVariantId of childVariantIds){let sum=0;for(const item of cart.items){if(Number(item.variant_id)!==Number(childVariantId))continue;const lineProperties=item.properties||{};String(lineProperties._registry??"")===registryIdString&&String(lineProperties._bundleId??"")===bundleIdString&&(sum+=Number(item.quantity)||0)}min=Math.min(min,sum)}return min===1/0?0:min}
1function registryBundleCompleteUnits(cart,registryId,parentVariantId,bundleId,childVariantIds){const byParentLikeNormal=sumRegistryCartQty(cart,registryId,parentVariantId);return byParentLikeNormal>0?byParentLikeNormal:minRegistryScopedBundleCompletes(cart,registryId,bundleId,childVariantIds)}function parseGridBundleMetaFromCard(card){const compositionId=card.dataset.gridBundleCompositionId,raw=card.dataset.gridBundleChildVariantIds;if(!compositionId||raw==null||raw==="")return null;let parsed;try{parsed=JSON.parse(raw)}catch{return null}if(!Array.isArray(parsed)||parsed.length===0)return null;const childVariantIds=[];for(const id of parsed){const parsedVariantId=Number(id);if(!Number.isFinite(parsedVariantId)||parsedVariantId<=0)return null;childVariantIds.push(parsedVariantId)}return{compositionId:String(compositionId),childVariantIds,title:String(card.dataset.gridBundleTitle??"")}}function findRegistryCard(variantId,compositionId){const variantSelector=CSS.escape(String(variantId));return compositionId?document.querySelector(`.registry-card[variant-id="${variantSelector}"][data-grid-bundle-composition-id="${CSS.escape(compositionId)}"]`):document.querySelector(`.registry-card[variant-id="${variantSelector}"]:not([data-grid-bundle-composition-id])`)}function gridBundleLineItemProperties(registryId,meta){return{_bundleId:meta.compositionId,_bundle_title:meta.title,_bundle_builder:GRID_BUNDLE_BUILDER,_registry:String(registryId)}}function formatRegistryBundleLineLabel(line){return`1 \xD7 ${line.title||""}`.trim()}function applyRegistryGridBundlePresentation(cardElements,registryRoot,presentation){const{card}=cardElements,wrap=card.querySelector(".registry-card__bundle-wrap"),toggle=card.querySelector(".registry-card__bundle-toggle"),linesWrap=card.querySelector(".registry-card__bundle-lines");if(!wrap||!toggle||!linesWrap||!presentation?.lines?.length)return;const lineRowTemplate=document.getElementById(REGISTRY_BUNDLE_LINE_ROW_TEMPLATE_ID);if(!(lineRowTemplate instanceof HTMLTemplateElement))return;const showTpl=registryRoot?.dataset?.registryBundleShow||"",hideTpl=registryRoot?.dataset?.registryBundleHide||"";linesWrap.replaceChildren();const thumbPx=REGISTRY_GRID_BUNDLE_THUMB;for(const line of presentation.lines){const row=lineRowTemplate.content.cloneNode(!0).firstElementChild;if(!(row instanceof HTMLElement))continue;const thumbImg=row.querySelector(".registry-card__bundle-thumb"),emptyThumb=row.querySelector(".registry-card__bundle-thumb-slot_empty"),lineTextEl=row.querySelector(".registry-card__bundle-line");!(thumbImg instanceof HTMLImageElement)||!(emptyThumb instanceof HTMLElement)||!(lineTextEl instanceof HTMLElement)||(lineTextEl.textContent=formatRegistryBundleLineLabel(line),line.imageUrl?(emptyThumb.remove(),thumbImg.hidden=!1,thumbImg.alt=line.title?String(line.title):"",thumbImg.width=thumbPx,thumbImg.height=thumbPx,thumbImg.src=line.imageUrl):(thumbImg.remove(),emptyThumb.hidden=!1),linesWrap.appendChild(row))}const lineCount=presentation.lines.length;toggle.hidden=!1,wrap.hidden=!1,toggle.textContent=`${showTpl||"Show bundle items"}${lineCount?` (${lineCount})`:""}`,toggle.setAttribute("aria-expanded","false"),linesWrap.hidden=!0,toggle.addEventListener("click",()=>{const nextOpen=!(toggle.getAttribute("aria-expanded")==="true");toggle.setAttribute("aria-expanded",nextOpen?"true":"false"),linesWrap.hidden=!nextOpen,toggle.textContent=nextOpen?`${hideTpl||"Hide bundle items"}${lineCount?` (${lineCount})`:""}`:`${showTpl||"Show bundle items"}${lineCount?` (${lineCount})`:""}`},{passive:!0})}async function resolveRegistryLineStockAndHandle(cardElements,variantId,item,storefrontConfigured){let resolvedHandle=resolveRegistryProductHandle(item),availabilityFromStorefrontApi=!1;const sfVariantCtx=storefrontConfigured?await fetchRegistryVariantStorefrontContext(variantId):null;return sfVariantCtx?.handle&&(resolvedHandle=sfVariantCtx.handle),sfVariantCtx&&typeof sfVariantCtx.availableForSale=="boolean"&&(applyRegistryStockUi(cardElements,sfVariantCtx.availableForSale),availabilityFromStorefrontApi=!0),availabilityFromStorefrontApi||(resolvedHandle?await applyAvailabilityFromAjaxProductJson(cardElements,resolvedHandle,variantId):await applyAvailabilityFromAjaxVariantJson(cardElements,variantId)),{resolvedHandle,availabilityFromStorefrontApi}}async function resolveBundleCardDisplayProduct(item,variantId){const product=item?.product,storedComposition=item?.gridBundleComposition;if(!product||!storedComposition?.childVariantIds?.length||Number(variantId)!==Number(storedComposition.childVariantIds[0]))return product;const bundleVariantId=Number(storedComposition.bundleVariantId);if(bundleVariantId>0){const fetched=await fetchRegistryBundleLineDisplayProduct(bundleVariantId);if(fetched)return fetched}return product}async function loadGridBundlePresentation(resolvedHandle,storefrontConfigured){if(!resolvedHandle||!storefrontConfigured)return null;try{return await fetchGridBundleRegistryPresentation(resolvedHandle)}catch(e){return console.error(e),null}}function applyGridBundleToRegistryCard(cardElements,registryRoot,product,parentVariantNumeric,gridPresentation,storedComposition=null){const childVariantIds=storedComposition?.childVariantIds||gridPresentation?.childVariantIds;
1if(!childVariantIds?.length)return null;const{card,titleEl}=cardElements,bundleCompositionId=storedComposition?.compositionId||[parentVariantNumeric,...childVariantIds].join(":");card.dataset.gridBundleCompositionId=bundleCompositionId,card.dataset.gridBundleChildVariantIds=JSON.stringify(childVariantIds);const displayTitle=gridPresentation?.bundleTitle||product.title||"";return card.dataset.gridBundleTitle=displayTitle,titleEl.textContent=displayTitle,applyRegistryGridBundlePresentation(cardElements,registryRoot,{...gridPresentation,childVariantIds,lines:gridPresentation?.lines||[]}),parseGridBundleMetaFromCard(card)}export async function createProductCard(item,{registryId,sectionId,isManagementPage,cartQuantityByVariantId={},cart=null}){const cardElements=buildRegistryProductCardElements();if(!cardElements)return console.error("Failed to build registry product card elements"),null;const{card,qtyValue,minusBtn,plusBtn,addToCartBtn,cartCompleteEl,actions,actionsExtra,removeBtn,replaceBtn,variantTitleEl}=cardElements;if(card.dataset.registryMode=isManagementPage?"management":"guest",!applyBaseCardData(cardElements,item,registryId))return null;const registryRoot=document.querySelector(".boa-registry"),{product,variantId,quantity=0,purchasedQuantity=0,variantTitle="",id=""}=item??{},productId=product?.productId??"",parentVariantNumeric=Number(variantId),setupCardBaseArgs={qtyValue,minusBtn,plusBtn,quantity,purchasedQuantity,productId,registryId,variantId};card.dataset.registryQuantity=String(quantity);const storedComposition=item?.gridBundleComposition,hasStoredBundle=!!storedComposition?.childVariantIds?.length,storefrontConfigured=isStorefrontRegistryConfigured();let resolvedHandle=resolveRegistryProductHandle(item);({resolvedHandle}=await resolveRegistryLineStockAndHandle(cardElements,variantId,item,storefrontConfigured));const imageFallbackByVariantId=Object.fromEntries(Object.entries(storedComposition?.childLineImages||{}).map(([rawId,rawUrl])=>[Number(rawId),String(rawUrl||"").trim()]).filter(([lineId,url])=>Number.isFinite(lineId)&&lineId>0&&url)),cardImageUrl=product?.featuredMedia?.preview?.image?.url;cardImageUrl&&parentVariantNumeric&&(imageFallbackByVariantId[parentVariantNumeric]=String(cardImageUrl));let gridPresentation=null;hasStoredBundle?gridPresentation=await hydrateGridBundlePresentationLines(storedComposition.childVariantIds,storedComposition.title||product?.title||"",imageFallbackByVariantId):isManagementPage||(gridPresentation=await loadGridBundlePresentation(resolvedHandle,storefrontConfigured));const bundleMeta=applyGridBundleToRegistryCard(cardElements,registryRoot,product,parentVariantNumeric,gridPresentation,storedComposition);setVariantTitle(variantTitleEl,variantTitle);const displayProduct=isManagementPage?product:await resolveBundleCardDisplayProduct(item,variantId),vendorText=displayProduct?.vendor!=null?String(displayProduct.vendor).trim():"";cardElements.vendorEl.textContent=vendorText,cardElements.vendorEl.hidden=!vendorText,applyPriceDisplay(cardElements,displayProduct),applyPurchaseState(cardElements,{purchasedQuantity,quantity,isManagementPage});const compositionId=card.dataset.gridBundleCompositionId||storedComposition?.compositionId;if(qtyValue&&(qtyValue.id=compositionId?`Quantity-${id}-${String(compositionId).replace(/:/g,"-")}`:`Quantity-${id}`),isManagementPage)addToCartBtn.remove(),purchasedQuantity>0&&actionsExtra.remove(),setupManagementCard({...setupCardBaseArgs,compositionId,removeBtn,replaceBtn});else if(actions.remove(),purchasedQuantity<quantity){card.dataset.registryGuestActive="true";const remainedQuantity=Math.max(0,quantity-purchasedQuantity);card.dataset.registryRemained=String(remainedQuantity);let cartQtyGuest=Number(cartQuantityByVariantId[String(variantId)])||0;bundleMeta&&cart&&(cartQtyGuest=registryBundleCompleteUnits(cart,registryId,parentVariantNumeric,bundleMeta.compositionId,bundleMeta.childVariantIds)),setupGuestCard({...setupCardBaseArgs,card,addToCartBtn,cartCompleteEl,sectionId,initialCartQty:cartQtyGuest})}else card.dataset.registryGuestActive="false";return card}function buildRegistryProductCardElements(templateId="RegistryProductCard"){const template=document.getElementById(templateId);if(!template?.content)return console.error(`${templateId} template not found`),null;const card=template.content.cloneNode(!0).firstElementChild;if(!card)return console.error(`Failed to clone ${templateId} template`),null;const required={image:card.querySelector(".registry-card__image"),vendorEl:card.querySelector(".registry-card__vendor"),titleEl:card.querySelector(".registry-card__title"),priceEl:card.querySelector(".registry-card__price"),priceClubEl:card.querySelector(".registry-card__price-club"),priceDiscountContainerEl:card.querySelector(".registry-card__price-discount"),priceDiscountValueEl:card.querySelector(".registry-card__price-discount-value"),badgeFull:card.querySelector(".registry-card__purchased-badge_full"),badgePartial:card.querySelector(".registry-card__purchased-badge_partial"),partialCount:card.querySelector(".registry-card__purchased-badge-partial-count"),okIcon:card.querySelector(".registry-card__ok-icon"),addToCartBtn:card.querySelector(".registry-card__add-btn"),cartCompleteEl:card.querySelector(".registry-card__cart-complete"),quantitySelector:card.querySelector(".registry-card__quantity"),qtyActionsRow:card.querySelector(".registry-card__qty-actions-row"),qtyValue:card.querySelector(".registry-card__qty-value"),minusBtn:card.querySelector(".registry-card__qty-btn_minus"),plusBtn:card.querySelector(".registry-card__qty-btn_plus"),outOfStockEl:card.querySelector(".registry-card__out-of-stock"),actionsExtra:card.querySelector(".registry-card__actions-extra"),actions:card.querySelector(".registry-card__actions"),removeBtn:card.querySelector(".registry-card__remove-btn"),replaceBtn:card.querySelector(".registry-card__replace-btn"),variantTitleEl:card.querySelector(".registry-card__variant-title")},missing=Object.entries(required).filter(([,el])=>!el).map(([key])=>key);return missing.length?(console.error("Missing required elements in registry product card",{missing}),null):{card,...required}}function applyBaseCardData(cardElements,item,registryId){const{card,image,titleEl}=cardElements,{product,variantId,available=!0}=item??{},imageUrl=product?.featuredMedia?.preview?.image?.url??"";
1return!product||!imageUrl?(console.error("Missing base product data in registry product card",{hasProduct:!!product,hasImageUrl:!!imageUrl}),!1):(image.src=imageUrl,image.alt=product.title,titleEl.textContent=product.title,applyRegistryStockUi(cardElements,available),card.setAttribute("variant-id",variantId),card.dataset.registryId=registryId,!0)}function setVariantTitle(variantTitleEl,variantTitle){variantTitle&&variantTitle!==DEFAULT_VARIANT_TITLE?(variantTitleEl.textContent=variantTitle,variantTitleEl.hidden=!1):variantTitleEl.hidden=!0}function applyPurchaseState(cardElements,{purchasedQuantity,quantity,isManagementPage}){const{badgePartial,badgeFull,okIcon,priceEl,priceClubEl,priceDiscountContainerEl,addToCartBtn,quantitySelector,qtyActionsRow,cartCompleteEl,partialCount,removeBtn}=cardElements;switch(!0){case purchasedQuantity===0:badgePartial.hidden=!0,badgeFull.hidden=!0,okIcon.hidden=!0,priceEl.hidden=!1,priceClubEl.hidden=!1;break;case purchasedQuantity===quantity:priceDiscountContainerEl.classList.add("registry-card__price-discount_hidden"),priceClubEl.hidden=!0,isManagementPage?(badgePartial.hidden=!0,badgeFull.hidden=!1,okIcon.hidden=!0,priceEl.hidden=!0,removeBtn.disabled=!0):(badgePartial.hidden=!0,badgeFull.hidden=!0,okIcon.hidden=!1,addToCartBtn.hidden=!0,quantitySelector.hidden=!0,qtyActionsRow&&(qtyActionsRow.hidden=!0),cartCompleteEl&&(cartCompleteEl.hidden=!0));break;default:priceEl.hidden=!1,priceClubEl.hidden=!1,isManagementPage?(badgeFull.hidden=!0,badgePartial.hidden=!1,partialCount.textContent=`${purchasedQuantity}/${quantity}`,okIcon.hidden=!0,removeBtn.disabled=!0):(badgePartial.hidden=!0,okIcon.hidden=!0);break}}function applyPriceDisplay(cardElements,product){const{priceEl,priceClubEl,priceDiscountContainerEl,priceDiscountValueEl}=cardElements,priceData=product?.priceRangeV2?.minVariantPrice;if(!priceData){console.error("Missing price data in registry product card");return}const priceClubData={amount:product?.clubMemberPrice?.value||0,currencyCode:"ILS"};if(priceEl.textContent=formatPrice(priceData),!(priceClubData.amount>0)){priceDiscountContainerEl.classList.add("registry-card__price-discount_hidden"),priceEl.classList.remove("registry-card__price_strikethrough"),priceClubEl.textContent="",priceDiscountValueEl.textContent="";return}const priceDiscountData={amount:priceData.amount-priceClubData.amount,currencyCode:priceClubData.currencyCode||priceData.currencyCode};priceDiscountContainerEl.classList.remove("registry-card__price-discount_hidden"),priceEl.classList.add("registry-card__price_strikethrough"),priceClubEl.textContent=formatPrice(priceClubData),priceDiscountValueEl.textContent=formatPrice(priceDiscountData,!0)}function setupManagementCard({compositionId,qtyValue,minusBtn,plusBtn,variantId,quantity,registryId,productId,removeBtn,replaceBtn,purchasedQuantity}){const minQuantity=Math.max(1,purchasedQuantity),store=createStore({quantity,confirmed:quantity,loading:!1});store.subscribe(state=>{qtyValue.textContent=state.quantity,minusBtn.disabled=state.loading||state.quantity<=minQuantity,plusBtn.disabled=state.loading});const debouncedSync=debounce(()=>{store.setState({loading:!0}),syncQuantityWithServer(variantId,store,registryId,compositionId)},DEBOUNCE_DELAY);plusBtn.addEventListener("click",()=>{store.setState(state=>({...state,quantity:state.quantity+1})),debouncedSync()}),minusBtn.addEventListener("click",()=>{store.setState(state=>({...state,quantity:Math.max(minQuantity,state.quantity-1)})),debouncedSync()}),removeBtn?.addEventListener("click",()=>{const message=document.getElementById("ConfirmDialog").dataset.removeProduct;openConfirmDialog(message,()=>removeProduct(variantId,registryId,compositionId))}),replaceBtn?.addEventListener("click",()=>openReplaceDialog(variantId,productId,registryId,compositionId))}function setupGuestCard({card,qtyValue,minusBtn,plusBtn,quantity,purchasedQuantity,productId,addToCartBtn,cartCompleteEl,sectionId,variantId,registryId,initialCartQty}){const remainedQuantity=Math.max(0,quantity-(purchasedQuantity??0)),remainingToAdd=Math.max(0,remainedQuantity-initialCartQty),maxPick=Math.max(1,remainingToAdd),initialPickQty=remainingToAdd>0?maxPick:remainedQuantity,store=createStore({quantity:initialPickQty,maxQuantity:remainingToAdd>0?maxPick:1});guestCardAddQtyStoreByCard.set(card,store),store.subscribe(state=>{addToCartBtn.classList.contains(REGISTRY_ADD_BTN_SLOT_ONLY_CLASS)||(qtyValue.textContent=String(state.quantity),minusBtn.disabled=state.quantity<=1,plusBtn.disabled=state.quantity>=state.maxQuantity)}),plusBtn.addEventListener("click",()=>{addToCartBtn.classList.contains(REGISTRY_ADD_BTN_SLOT_ONLY_CLASS)||store.setState(s=>({...s,quantity:Math.min(s.quantity+1,s.maxQuantity)}))}),minusBtn.addEventListener("click",()=>{addToCartBtn.classList.contains(REGISTRY_ADD_BTN_SLOT_ONLY_CLASS)||store.setState(s=>({...s,quantity:Math.max(1,s.quantity-1)}))}),addToCartBtn.dataset.productId=productId,addToCartBtn.addEventListener("click",()=>{addToCart({card,variantId,sectionId,registryId,productId})}),updateGuestCartLimitUI({card,addToCartBtn,cartCompleteEl,minusBtn,plusBtn,qtyValue,remainedQuantity,cartQty:initialCartQty,limitReached:remainingToAdd<=0})}function updateGuestCartLimitUI({card,addToCartBtn,cartCompleteEl,minusBtn,plusBtn,qtyValue,remainedQuantity,cartQty,limitReached}){if(!addToCartBtn||!cartCompleteEl)return;const showProgressCheck=cartQty>=1;if(cartCompleteEl.hidden=!showProgressCheck,card?.dataset.registryMode==="guest"&&card?.dataset.registryOutOfStock==="true"){addToCartBtn.hidden=!0,addToCartBtn.classList.remove(REGISTRY_ADD_BTN_SLOT_ONLY_CLASS),addToCartBtn.removeAttribute("aria-hidden");const quantitySelector=card.querySelector(".registry-card__quantity"),qtyActionsRow=card.querySelector(".registry-card__qty-actions-row");quantitySelector&&(quantitySelector.hidden=!0),qtyActionsRow&&(qtyActionsRow.hidden=!0);return}if(limitReached){addToCartBtn.hidden=!1,addToCartBtn.classList.add(REGISTRY_ADD_BTN_SLOT_ONLY_CLASS),addToCartBtn.setAttribute("aria-hidden","true");const store=guestCardAddQtyStoreByCard.get(card);store&&store.setState({quantity:remainedQuantity,maxQuantity:1}),qtyValue.textContent=String(remainedQuantity),minusBtn.disabled=!0,plusBtn.disabled=!0}else{addToCartBtn.hidden=!1,addToCartBtn.classList.remove(REGISTRY_ADD_BTN_SLOT_ONLY_CLASS),addToCartBtn.removeAttribute("aria-hidden");const store=guestCardAddQtyStoreByCard.get(card);if(store){const s=store.getState();qtyValue.textContent=String(s.quantity),minusBtn.disabled=s.quantity<=1,plusBtn.disabled=s.quantity>=s.maxQuantity}}}async function refreshGuestCardFromCart(card,cartPreloaded=null){if(card.dataset.registryGuestActive!=="true")return;const registryId=card.dataset.registryId,variantId=card.getAttribute("variant-id");if(!registryId||!variantId)return;const cart=cartPreloaded??await getCart(),remained=Number(card.dataset.registryRemained||"0");let cartQty=sumRegistryCartQty(cart,registryId,variantId);const bundleMetaRefresh=parseGridBundleMetaFromCard(card);bundleMetaRefresh&&(cartQty=registryBundleCompleteUnits(cart,registryId,variantId,bundleMetaRefresh.compositionId,bundleMetaRefresh.childVariantIds));const remainingToAdd=Math.max(0,remained-cartQty),store=guestCardAddQtyStoreByCard.get(card);store&&(remainingToAdd<=0?store.setState({quantity:remained,maxQuantity:1}):store.setState(s=>{const newMax=Math.max(1,remainingToAdd);let qty=Math.min(s.quantity,newMax);return qty=Math.max(1,qty),{quantity:qty,maxQuantity:newMax}})),updateGuestCartLimitUI({card,addToCartBtn:card.querySelector(".registry-card__add-btn"),cartCompleteEl:card.querySelector(".registry-card__cart-complete"),minusBtn:card.querySelector(".registry-card__qty-btn_minus"),plusBtn:card.querySelector(".registry-card__qty-btn_plus"),qtyValue:card.querySelector(".registry-card__qty-value"),remainedQuantity:remained,cartQty,limitReached:remainingToAdd<=0})}function registryMutationBody(variantId,compositionId,extra={}){const body={variantId:Number(variantId),...extra};return compositionId&&(body.compositionId=compositionId),body}async function deleteRegistryLine(registryId,variantId,compositionId){try{const response=await fetch(`${REGISTRY_END_POINT}/${registryId}`,{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify(registryMutationBody(variantId,compositionId))});if(!response.ok)return!1;const{success}=await response.json();return success&&document.dispatchEvent(new CustomEvent("registry:count-changed")),!!success}catch(error){return console.error(error),!1}}async function syncQuantityWithServer(variantId,store,registryId,compositionId){try{const response=await fetch(`${REGISTRY_END_POINT}/${registryId}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(registryMutationBody(variantId,compositionId,{quantity:store.getState().quantity}))});if(!response.ok)throw new Error("Failed to update product quantity");const{success}=await response.json();success?store.setState(state=>({...state,confirmed:state.quantity,loading:!1})):store.setState(state=>({...state,quantity:state.confirmed,loading:!1}))}catch(error){store.setState(state=>({...state,quantity:state.confirmed,loading:!1})),console.error(error)}}async function removeProduct(variantId,registryId,compositionId){try{if(await deleteRegistryLine(registryId,variantId,compositionId)){const cardEl=findRegistryCard(variantId,compositionId);if(!cardEl){console.error("Failed to find registry card element for removed variant",variantId);return}cardEl.remove()}else console.error("Server rejected remove request for variant",variantId)}catch(error){console.error(error)}}async function addToCart({card,variantId,sectionId,registryId,productId}){const addToCartBtn=card?.querySelector(".registry-card__add-btn");if(!addToCartBtn||addToCartBtn.classList.contains(REGISTRY_ADD_BTN_SLOT_ONLY_CLASS)||card?.dataset.registryOutOfStock==="true"||addToCartBtn.disabled||addToCartBtn.classList.contains("btn--loading"))return;const store=guestCardAddQtyStoreByCard.get(card),pickQty=Math.max(1,Math.floor(Number(store?.getState().quantity??1)));addToCartBtn.classList.add("btn--loading"),addToCartBtn.disabled=!0;try{let response;const bundleMetaAdd=parseGridBundleMetaFromCard(card);if(bundleMetaAdd){const baseProps=gridBundleLineItemProperties(registryId,bundleMetaAdd),items=bundleMetaAdd.childVariantIds.map(cid=>({id:Number(cid),quantity:pickQty,properties:{...baseProps}}));response=await fetch("/cart/add.js",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({items})})}else response=await fetch("/cart/add.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({quantity:pickQty,form_type:"product","product-id":productId,id:variantId,"section-id":sectionId,properties:{_registry:registryId}})});if(!response.ok)throw new Error("Failed to add item to cart");let product;try{product=await response.json()}catch(parseError){console.error("addToCart: failed to parse /cart/add.js response JSON",parseError)}publish(EVENTS.ajaxProductAdded,{detail:{product,addToCartBtn}});const cartAfter=await getCart();await refreshGuestCardFromCart(card,cartAfter)}catch(error){console.error(error)}finally{addToCartBtn.classList.remove("btn--loading"),addToCartBtn.classList.contains(REGISTRY_ADD_BTN_SLOT_ONLY_CLASS)||(addToCartBtn.disabled=!1)}}async function syncRegistryCardsCartState(){const registry=document.querySelector(".boa-registry");if(registry)try{const cart=await getCart(),cards=registry.querySelectorAll(".registry-card");for(const card of cards)card.dataset.registryGuestActive==="true"&&await refreshGuestCardFromCart(card,cart)}catch(error){console.error("syncRegistryCardsCartState:",error)}}document.addEventListener("cart:updated",()=>{syncRegistryCardsCartState()});const RECOMMENDATIONS_SECTION_ID="boa-registry-recommendations";async function openReplaceDialog(currentVariantId,productId,registryId,currentCompositionId){const dialog=document.getElementById("RegistryReplaceDialog");if(!dialog){console.error("RegistryReplaceDialog not found");return}const body=dialog.querySelector(".registry-replace-dialog__body");if(!body){console.error("RegistryReplaceDialog body not found");return}const statusEl=dialog.querySelector(".registry-replace-dialog__status"),closeBtn=dialog.querySelector(".registry-replace-dialog__close"),loadingEl=document.createElement("div");loadingEl.className="registry-replace-dialog__loading",loadingEl.textContent=dialog.dataset.loadingText??"",body.replaceChildren(loadingEl),dialog.showModal(),closeBtn?.addEventListener("click",()=>dialog.close()),dialog.addEventListener("cancel",()=>dialog.close(),{once:!0});function handleDialogClick(event){event.target===dialog&&dialog.close()}dialog.addEventListener("click",handleDialogClick,{once:!0});try{const response=await fetch(`/recommendations/products?product_id=${productId}&section_id=${RECOMMENDATIONS_SECTION_ID}&limit=4`);if(!response.ok)throw new Error("Failed to load recommendations");const html=await response.text(),parsed=new DOMParser().parseFromString(html,"text/html"),recommendations=parsed.querySelector(".registry-recommendations");
1if(!recommendations){const empty=parsed.querySelector(".registry-recommendations__empty");body.innerHTML=empty?.outerHTML??'<p class="registry-replace-dialog__status"></p>';return}body.innerHTML=recommendations.outerHTML,statusEl&&(statusEl.textContent="",statusEl.className="registry-replace-dialog__status");const setStatus=(type,text)=>{if(!statusEl){console.error("Missing required elements in registry replace dialog",{hasStatusEl:!1});return}statusEl.textContent=text||"",statusEl.className=`registry-replace-dialog__status${type?` registry-replace-dialog__status_${type}`:""}`},cards=body.querySelectorAll(".registry-recommendations__item"),setItemsDisabled=disabled=>{for(const card of cards)card.disabled=disabled,card.setAttribute("aria-disabled",disabled?"true":"false"),card.classList.toggle("registry-recommendations__item_disabled",disabled)};for(const card of cards)card.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation();const variantId=card.dataset.variantId;if(!variantId){console.error("replaceProduct: variantId not found in card");return}const productUrl=card.dataset.productUrl??"",variantsCount=parseInt(card.dataset.variantsCount,10)||1;setItemsDisabled(!0),setStatus("pending",dialog.dataset.replacingText??""),variantsCount>1?deleteRegistryLine(registryId,currentVariantId,currentCompositionId).then(success=>{success?(document.dispatchEvent(new CustomEvent("registry:reload")),dialog.close(),productUrl&&window.open(productUrl,"_blank","noopener, noreferrer")):(setStatus("error",dialog.dataset.replaceErrorText??""),setItemsDisabled(!1))}):replaceProductInRegistry(currentVariantId,Number(variantId),registryId,currentCompositionId).then(success=>{success?(setStatus("success",dialog.dataset.replaceSuccessText??""),setTimeout(()=>dialog.close(),1500)):(setStatus("error",dialog.dataset.replaceErrorText??""),setItemsDisabled(!1))})})}catch(error){console.error(error),dialog.close()}}async function replaceProductInRegistry(oldVariantId,newVariantId,registryId,oldCompositionId){try{if(!await deleteRegistryLine(registryId,oldVariantId,oldCompositionId))return console.error("Server rejected delete for variant",oldVariantId),!1;const addResponse=await fetch(`${REGISTRY_END_POINT}/${registryId}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({variantId:Number(newVariantId),registryId,quantity:1})});if(!addResponse.ok)return console.error("Failed to add new product"),!1;const{success:added}=await addResponse.json();return added?(document.dispatchEvent(new CustomEvent("registry:reload")),!0):(console.error("Server rejected add for variant",newVariantId),!1)}catch(error){return console.error(error),!1}}function formatPrice(priceData,isDiscount=!1){if(!priceData||typeof priceData.amount>"u"||!priceData.currencyCode)return"";const{amount,currencyCode}=priceData;if(currencyCode==="ILS"){const amountString2=new Intl.NumberFormat("he-IL",{style:"currency",currency:"ILS"}).format(amount);return isDiscount?`(-${amountString2})`:amountString2}const amountString=new Intl.NumberFormat("en-US",{style:"currency",currency:currencyCode}).format(amount);return isDiscount?`(-${amountString})`:amountString}
2//# sourceMappingURL=/cdn/shop/t/230/assets/boa-registry-product-card.js.map?v=101026547176831074761787057918

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.