1// è´ç©è½¦ä¾§è¾¹æ èªå®ä¹å ç´ ï¼æ»åºå¼è´ç©è½¦ï¼ 2if (!customElements.get('f-cart-drawer')) { 3 class FCartDrawer extends HTMLElement { 4 cartUpdateUnsubscriber = undefined; // è´ç©è½¦æ´æ°åæ¶è®¢é 彿° 5 6 constructor() { 7 super(); 8 // ç»å®äºä»¶çå¬å¨ä»¥ä¿ææ£ç¡®çthisä¸ä¸æ 9 this.getSectionToRenderListener = this.getSectionToRender.bind(this); 10 // å åæ¶ä¸ä¸æ¬¡ç订é ï¼å¦æåå¨ï¼ 11 if (this.cartUpdateUnsubscriber && typeof this.cartUpdateUnsubscriber === 'function') { 12 this.cartUpdateUnsubscriber(); 13 } 14 15 // 订é è´ç©è½¦æ´æ°äºä»¶ 16 this.cartUpdateUnsubscriber = FecEvents.on(FecTheme.pubSubEvents.cartDrawerRefresh, this.getDrawerData.bind(this)); 17 18 } 19 20 // è·åç¨äºAJAXè´ç©è½¦æ´æ°çåºååç§° 21 get sectionName() { 22 return 'cart-drawer'; 23 } 24 25 // è·åè´ç©è½¦ä¾§è¾¹æ å é¨å ç´ 26 get cartDrawerInner() { 27 return this.querySelector(".f-cart-drawer__inner"); 28 } 29 30 // è·åå ³é徿 å ç´ 31 get cartDrawerCloseIcon() { 32 return this.querySelector(".f-cart-drawer__close"); 33 } 34 35 getDrawerData() {//è·åè´ç©è½¦æ°æ® 36 api.get('/api/checkout/cart/get-cart-info', { 37 format: 'sidebar_html',//ä¾§æ è´ç©è½¦ sidebar_html è´ç©è½¦é¡µé¢ page_html 38 page_type: window.baseData.page_type 39 }).then(res => { 40 $log('getDrawerData-è´ç©è½¦æ°æ®', res) 41 // å°è´ç©è½¦æ°æ®æ¾å° html éæ¹ä¾¿åå¼ 42 window.$updateCartItemsData(res.items) 43 this.cartUpdateUnsubscriber();//ä¸å®è¦åæ¶è®¢é ï¼é²æ¢ html æ¸²ææ¶ï¼éå¤çå¬ 44 if (res.payment_new_paypal) { 45 sessionStorage.setItem("payment_new_paypal", JSON.stringify(res.payment_new_paypal)) 46 } else { 47 sessionStorage.removeItem("payment_new_paypal"); 48 } 49 //å°è´ç©è½¦å®æ´ç html æå ¥å° page-right-cart-drawer è¿ä¸ª classé 50 if (res.payment_paypal && res.payment_paypal.hasOwnProperty('commit')) { 51 sessionStorage.setItem('paypal_info', JSON.stringify(res.payment_paypal));//PayPal ä¿¡æ¯åèµ·æ¥ 52 } else { 53 sessionStorage.removeItem('paypal_info') 54 } 55 let cart_qty = res.count 56 FecEvents.emit(FecTheme.pubSubEvents.cartUpdate, {cart_qty: cart_qty});//æ´æ°é¡¶é¨è´ç©è½¦æ°é 57 58 let cartDrawer = document.querySelector('.page-right-cart-drawer') 59 if (cartDrawer) { 60 let isOpen = cartDrawer.querySelector('.f-cart-drawer--active') 61 if (isOpen) {//å·²ç»æå¼çªå£äºï¼ç¨ js æ¿æ¢æ¾ç¤ºæ»éé¢å³å¯ 62 // 1ï¸ è§£æè¿åç HTMLï¼å»ºç«ä¸´æ¶ DOM å®¹å¨ 63 let tempDiv = document.createElement('div'); 64 tempDiv.innerHTML = res.html; 65 66 // å®ä¹éè¦æ¿æ¢çæ ç¾éæ©å¨ï¼å¯æ©å±ï¼ 67 const targets = [ 68 '.f-cart__subtotal--price', 69 '.f-cart-drawer__body' 70 ]; 71 72 // 2ï¸ å¾ªç¯æ¿æ¢ 73 targets.forEach(selector => { 74 let newEl = tempDiv.querySelector(selector); 75 let oldEl = isOpen.querySelector(selector); 76 77 if (newEl && oldEl) { 78 oldEl.outerHTML = newEl.outerHTML; 79 $log(` å·²æ¿æ¢ ${selector}`); 80 } else { 81 $log(`æªæ¾å° ${selector} å ç´ `, {newEl, oldEl}); 82 } 83 }); 84 85 } else {//没ææå¼çªå£ï¼å¯ä»¥å¡å ¥ 86 cartDrawer.innerHTML = res.html; 87 } 88 } 89 90 }) 91 } 92 93 94 // å°å½ååºåæ·»å å°éè¦æ¸²æçåºååè¡¨ä¸ 95 getSectionToRender(event) { 96 event.detail.sections.push(this.sectionName); 97 } 98 99 // å ç´ æå ¥DOMæ¶è°ç¨ 100 connectedCallback() { 101 // çå¬è´ç©è½¦åºåæ´æ°äºä»¶ 102 document.addEventListener('cart:grouped-sections', this.get
102SectionToRenderListener); 103 104 // ç¹å»äºä»¶å¤çï¼ç¹å»å¤é¨æå ³éæé®æ¶å ³éä¾§è¾¹æ 105 this.addEventListener("click", (event) => { 106 if (event.target.closest(".f-cart-drawer__inner") !== this.cartDrawerInner || event.target === this.cartDrawerCloseIcon) { 107 this.close(); 108 } 109 }); 110 } 111 112 // å ç´ ä»DOMç§»é¤æ¶è°ç¨ 113 disconnectedCallback() { 114 document.removeEventListener('cart:grouped-sections', this.getSectionToRenderListener); 115 if (this.cartUpdateUnsubscriber) { 116 this.cartUpdateUnsubscriber(); 117 } 118 } 119 120 // æå¼è´ç©è½¦ä¾§è¾¹æ 121 open(triggeredBy) { 122 $log('è´ç©è½¦æå¼å½æ°', triggeredBy); 123 if (triggeredBy) this.setActiveElement(triggeredBy); // 设置触åå ç´ 124 this.classList.add("f-cart-drawer--active"); // æ·»å æ¿æ´»ç±» 125 setTimeout(() => { 126 this.classList.add("f-cart-drawer__inner-show"); // æ·»å æ¿æ´»ç±» 127 }, 200) 128 // document.documentElement.classList.add("prevent-scroll"); // 鲿¢é¡µé¢æ»å¨ 129 } 130 131 // å ³éè´ç©è½¦ä¾§è¾¹æ 132 close() { 133 this.classList.remove("f-cart-drawer__inner-show"); 134 135 // å»¶è¿ç§»é¤æ¿æ´»ç±»ï¼ç¡®ä¿å¨ç»å®æ 136 setTimeout(() => { 137 this.classList.remove("f-cart-drawer--active"); 138 document.documentElement.classList.remove("prevent-scroll"); 139 }, 300); 140 } 141 142 // 设置å½åæ´»å¨å ç´ 143 setActiveElement(element) { 144 this.activeElement = element; 145 } 146 } 147 148 customElements.define("f-cart-drawer", FCartDrawer); 149 150} 151 152// 注åèªå®ä¹å ç´ 153 154// è´ç©è½¦å 餿é®èªå®ä¹å ç´ 155if (!customElements.get('f-cart-remove-button')) { 156 class FCartRemoveButton extends HTMLElement { 157 constructor() { 158 super(); 159 // ç¹å»äºä»¶å¤çï¼å é¤å¯¹åºåå 160 this.addEventListener("click", (event) => { 161 event.preventDefault(); 162 api.post('/api/checkout/cart/delete-cart-item', {cart_item_id: this.dataset.itemId}).then(res => { 163 if (window.baseData.page_type === 'cart') { 164 FecEvents.emit(FecTheme.pubSubEvents.cartPageRefresh)//éç¥è´ç©è½¦é¡µå·æ° html ç»æ 165 } else { 166 FecEvents.emit(FecTheme.pubSubEvents.cartDrawerRefresh)//éç¥æ½å±å·æ° html ç»æ 167 } 168 this.removeCartEventTracking(this.dataset.itemId)//äºä»¶è¿½è¸ª 169 }).catch(err => { 170 FecTheme.Notification.show({ 171 method: "appendChild", 172 type: "error", 173 message: err.message, 174 duration: 5000, 175 }); 176 }); 177 }); 178 } 179 removeCartEventTracking(productId){//å é¤è´ç©è½¦ååäºä»¶è¿½è¸ª 180 let cartList = $getCartItemsData() 181 if (!Array.isArray(cartList) || cartList.length === 0) { 182 $log('è´ç©è½¦æ°æ®ä¸ºç©º'); 183 return; 184 } 185 // æ ¹æ® productId æ¥æ¾å¯¹åºçåå对象 186 const itemProduct = cartList.find(item => String(item.item_id) === String(productId)); 187 if (!itemProduct) { 188 return; 189 } 190 let google = document.querySelector('addons-google') 191 if (google) {//google 192 try { 193 google.removeCartGoogleAnalysis(itemProduct); 194 } catch (e) { 195 console.error(e); 196 } 197 } 198 199 200 } 201 } 202 203// 注åèªå®ä¹å ç´ 204 customElements.define("f-cart-remove-button", FCartRemoveButton); 205} 206 207// è´ç©è½¦æ¨¡æ¿èªå®ä¹å ç´ 208if (!customElements.get('f-cart')) { 209 class FCartTemplate extends HTMLElement { 210 constructor() { 211 super(); 212 // çå¬è´ç©è½¦åºåæ´æ°äºä»¶ 213 document.addEventListener('cart:grouped-sections', this.get
213SectionToRender.bind(this)); 214 $log('è´ç©è½¦é¡µé¢å è½½') 215 } 216 217 // è·ååºååç§° 218 get sectionName() { 219 return 'cart-template'; 220 } 221 222 // å°å½ååºåæ·»å å°éè¦æ¸²æçåºååè¡¨ä¸ 223 getSectionToRender(event) { 224 event.detail.sections.push(this.sectionName); 225 } 226 } 227 228// 注åèªå®ä¹å ç´ 229 customElements.define("f-cart", FCartTemplate); 230} 231 232// è´ç©è½¦ååå表èªå®ä¹å ç´ 233if (!customElements.get('f-cart-items')) { 234 class FCartItems extends HTMLElement { 235 cartUpdateUnsubscriber = undefined; // è´ç©è½¦æ´æ°åæ¶è®¢é 彿° 236 237 constructor() { 238 super(); 239 240 // 设置éè¦æ´æ°çåºååç§° 241 window.FoxKitSections = [this.sectionName, this.cartCountSectionName]; 242 this.rootUrl = '/' // è·åååºæ ¹URL 243 244 // ç»å®äºä»¶çå¬å¨ 245 this.onCartRefreshListener = this.onCartRefresh.bind(this); 246 document.addEventListener("cart:refresh", this.onCartRefreshListener); 247 248 // ç嬿°éè¾å ¥ååï¼ä½¿ç¨é²æå½æ°ï¼ 249 this.addEventListener('change', debounce(this.onChange.bind(this), 300)); 250 251 // 订é è´ç©è½¦æ´æ°äºä»¶ 252 this.cartUpdateUnsubscriber = FecEvents.on(FecTheme.pubSubEvents.cartUpdate, this.onCartUpdate.bind(this)); 253 } 254 255 // å ç´ æå ¥DOMæ¶è°ç¨ 256 connectedCallback() { 257 this.isCartPage = window.baseData.page_type === "cart"; // 夿æ¯å¦å¨è´ç©è½¦é¡µé¢ 258 this.cartDrawerInner = document.querySelector(".f-cart-drawer__inner");//ä¾§æ è´ç©è½¦ 259 260 // æ ¹æ®é¡µé¢ç±»å设置å è½½æç¤ºå¨ç®æ 261 let loadingTarget = this.cartDrawerInner; 262 if (this.isCartPage) loadingTarget = document.body; 263 this.loading = new FecLibs.AnimateLoading(loadingTarget, {overlay: loadingTarget}); 264 } 265 266 // è·ååºååç§° 267 get sectionName() { 268 return this.dataset.sectionName || 'cart-template'; 269 } 270 271 // è·åè´ç©è½¦æ°éåºååç§° 272 get cartCountSectionName() { 273 return 'cart-count'; 274 } 275 276 // å ç´ ä»DOMç§»é¤æ¶è°ç¨ 277 disconnectedCallback() { 278 // åæ¶è®¢é åäºä»¶çå¬ 279 if (this.cartUpdateUnsubscriber) { 280 this.cartUpdateUnsubscriber(); 281 } 282 document.removeEventListener("cart:refresh", this.onCartRefreshListener); 283 } 284 285 // æ°éè¾å ¥ååå¤ç 286 onChange(event) { 287 const {target} = event; 288 $log('è¾å ¥æ°éåäº', target, target.dataset, target.value) 289 if (target.closest('f-quantity-input')) { // å¦ææ¯æ°éè¾å ¥æ¡ 290 if (Number(target.value) > 0) { 291 this.updateQuantity( 292 target.dataset.index, // ååç´¢å¼ 293 target.value, // æ°æ°é 294 document.activeElement.getAttribute('name') || target.name, // æ´»å¨å ç´ åç§° 295 target // ç®æ å ç´ 296 ); 297 } 298 299 } 300 } 301 302 // è´ç©è½¦é误å¤ç 303 onCartError(errors, target, line) { 304 if (target) { 305 // 卿°éè¾å ¥æ¡æ¾ç¤ºé误 306 const quantityInput = target.closest('f-quantity-input'); 307 quantityInput.setValidity(errors); 308 } else { 309 // éå®åå°è´ç©è½¦é¡µé¢ 310 window.location.href = MinimogSettings.routes.cart; 311 } 312 313 // æ´æ°å®æ¶é误æç¤ºåºå 314 this.updateLiveRegions(line, errors); 315 } 316 317 // è´ç©è½¦å·æ°å¤ç 318 async onCartRefresh(event) { 319 $log('onCartRefresh', event) 320 const cartSelector = this.isCartPage ? 'f-cart' : 'f-cart-drawer'; 321 const cartElement = document.querySelector(cartSelector); 322 const cartCount = document.querySelectorAll('f-cart-count'); 323 324 try { 325 // è·åææ°çè´ç©è½¦æ°æ® 326 await fetch(`${this.rootUrl}?sections[]=${this.sectionName}§ions[]=${this.cartCountSectionName}`) 327 .then((response) => response.text()) 328 .then((responseText) => { 329 const parseJSON = JSON.parse(responseText); 330 331 // æ´æ°è´ç©è½¦å个åºå
332 this.getSectionsToRender().forEach((section) => { 333 const elementToReplace = 334 document.getElementById(section.id)?.querySelector(section.selector) || document.getElementById(section.id); 335 if (elementToReplace) elementToReplace.innerHTML = this.getSectionInnerHTML(parseJSON[this.sectionName], section.selector); 336 }); 337 338 // æ´æ°è´ç©è½¦æ°éæ¾ç¤º 339 const responseCartCount = parseJSON[this.cartCountSectionName]; 340 const newCartCount = new DOMParser().parseFromString(responseCartCount, "text/html"); 341 cartCount.forEach(cart => cart.onUpdate(newCartCount)); 342 }); 343 344 // 妿éè¦æå¼ä¾§è¾¹æ 345 if (event.detail?.open === true) { 346 if (!this.isCartPage) cartElement.open(); 347 } 348 } catch (error) { 349 console.error("onCartRefresh:", error); 350 } 351 } 352 353 // è´ç©è½¦æ´æ°å¤ç 354 onCartUpdate(event) { 355 $log('onCartUpdate-cart.js', event) 356 // ææ¶ç¨ä¸å° 357 return 358 359 // æ´æ°è´ç©è½¦å个åºå
360 this.getSectionsToRender().forEach((section) => { 361 const elementToReplace = document.getElementById(section.id)?.querySelector(section.selector); 362 if (elementToReplace) elementToReplace.innerHTML = this.getSectionInnerHTML(event.cart.sections[this.sectionName], section.selector); 363 }); 364 365 // 触åè´ç©è½¦æ´æ°äºä»¶ 366 document.dispatchEvent( 367 new CustomEvent('cart:updated', { 368 detail: { 369 cart: event.cart, 370 }, 371 }) 372 ); 373 } 374 375 // æ´æ°ååæ°é 376 updateQuantity(line, quantity, name, target) { 377 $log('æ´æ°è´ç©è½¦-updateQuantity', line, quantity, name, target) 378 379 this.loading.show(); // æ¾ç¤ºå è½½æç¤ºå¨ 380 let params = { 381 "cart_item_id": Number(target.dataset.itemId), 382 "updated_qty": Number(quantity) 383 } 384 $log('æ´æ°è´ç©è½¦-updateQuantity', line, quantity, name, params, target) 385 386 api.post('/api/checkout/cart/update-cart-item-qty', params).then((response) => { 387 // æ´æ°è´ç©è½¦æ°é å¢å è´ç©è½¦æ°éååç订é äºä»¶ 388 // document.querySelector('.page-right-cart-drawer').innerHTML = response.html; 389 $log('window.baseData.page_type', window.baseData.page_type) 390 if (window.baseData.page_type === 'cart') { 391 FecEvents.emit(FecTheme.pubSubEvents.cartPageRefresh)//éç¥è´ç©è½¦é¡µå·æ° html ç»æ 392 } else { 393 FecEvents.emit(FecTheme.pubSubEvents.cartDrawerRefresh)//éç¥æ½å±å·æ° html ç»æ 394 } 395 if (name === 'plus') {//å¢å æ°é 396 this.sendCardEventTracking(target.dataset.itemId, 1)//è´ç©è½¦äºä»¶è·è¸ª 397 } else if (name === 'updates') {//è¾å ¥æ¡æå¨è¾å ¥çå¼ 398 let oldQuantity = Number(target.dataset.cartQuantity); 399 let qty = Number(quantity) - oldQuantity; 400 if (qty > 0) {//计ç®åºå äºå 个åå 401 this.sendCardEventTracking(target.dataset.itemId, qty)//è´ç©è½¦äºä»¶è·è¸ª 402 } 403 } 404 405 }).catch((error) => { 406 if (error.code === 101000012) {//éå¶æå°è´ä¹°æ°é 407 let input = this.querySelector(`input.f-quantity__input[data-item-id="${target.dataset.itemId}"]`); 408 if (input) {//éæ°è°ç¨ 409 this.updateQuantity(line, input.min || 1, name, target) 410 } 411 } 412 FecTheme.Notification.show({ 413 method: "appendChild", 414 type: "error", 415 message: error.message, 416 duration: 5000, 417 }); 418 }).finally(() => { 419 this.loading.hide(); // éèå è½½æç¤ºå¨ 420 }) 421 422 } 423 424 // æ´æ°å®æ¶é误æç¤ºåºå 425 updateLiveRegions(line, message) { 426 let lineItemNode = document.getElementById(`MinimogCart-Item-${line}`); 427 if (message !== "" && lineItemNode) { 428 MinimogTheme.Notification.show({ 429 target: lineItemNode, 430 type: "warning", 431 message: message, 432 }); 433 } 434 } 435 436 // ä»HTMLåç¬¦ä¸²ä¸æåæå®éæ©å¨çå 容 437 getSectionInnerHTML(html, selector) { 438 return new DOMParser().parseFromString(html, 'text/html').querySelector(selector).innerHTML; 439 } 440 441 // è·åéè¦æ¸²æçåºåé ç½® 442 getSectionsToRender() { 443 return [ 444 { 445 id: 'FecCartCartDrawer', 446 selector: '#FecCartDrawerHeader', 447 }, 448 // ...å ¶ä»åºåé ç½® 449 ]; 450 } 451 452 453 //è´ç©è½¦äºä»¶è¿½è¸ª 454 sendCardEventTracking(productId, qty) { 455 let cartList = $getCartItemsData() 456 if (!Array.isArray(cartList) || cartList.length === 0) {
457 $log('è´ç©è½¦æ°æ®ä¸ºç©º'); 458 return; 459 } 460 // æ ¹æ® productId æ¥æ¾å¯¹åºçåå对象 461 const itemProduct = cartList.find(item => String(item.item_id) === String(productId)); 462 if (!itemProduct) { 463 return; 464 } 465 if (itemProduct.product_f_title) itemProduct['product_title'] = itemProduct.product_f_title 466 let facebook = document.querySelector('addons-facebook') 467 if (facebook) {//è¸ä¹¦ 468 try { 469 facebook.addToCardFb(itemProduct, qty); 470 } catch (e) { 471 console.error(e); 472 } 473 } 474 let tiktok = document.querySelector('addons-tiktok') 475 if (tiktok) {//TikTok 476 try { 477 tiktok.addToCartTiktok(itemProduct, qty); 478 } catch (e) { 479 console.error(e); 480 } 481 } 482 let pinterest = document.querySelector('addons-pinterest') 483 if (pinterest) {//pinterest 484 try { 485 pinterest.sendAddToCartPinterest(itemProduct, qty); 486 } catch (e) { 487 console.error(e); 488 } 489 } 490 let bing = document.querySelector('addons-bing') 491 if (bing) {//bing 492 try { 493 bing.addToCartBind(itemProduct, qty); 494 } catch (e) { 495 console.error(e); 496 } 497 } 498 let google = document.querySelector('addons-google') 499 if (google) {//google 500 try { 501 google.addToCartGoogleAnalysis(itemProduct, qty); 502 } catch (e) { 503 console.error(e); 504 } 505 } 506 507 508 } 509 } 510 511 customElements.define("f-cart-items", FCartItems); 512 513} 514 515 516// 注åèªå®ä¹å ç´ 517 518/* è´ç©è½¦éå åè½ */ 519if (!customElements.get("f-cart-addons")) { 520 class FCartAddons extends HTMLElement { 521 constructor() { 522 super(); 523 // å®ä¹éæ©å¨ 524 this.selectors = { 525 zipCode: '[name="address[zip]"]', // é®ç¼è¾å ¥æ¡ 526 province: '[name="address[province]"]', // çä»½éæ©æ¡ 527 country: '[name="address[country]"]', // å½å®¶éæ©æ¡ 528 addressForm: '[data-address="root"]', // å°å表å 529 shippingMessage: ".f-cart-addon__shipping-rate", // è¿è´¹ä¿¡æ¯æ¾ç¤ºåºå 530 cartDiscountCode: '[name="discount"]', // ææ£ç è¾å ¥æ¡ 531 cartDiscountCodeNoti: "[data-discount-noti]", // ææ£ç éç¥ 532 cartNote: '[name="note"]', // è´ç©è½¦å¤æ³¨ 533 saveAddonButton: ".f-cart-addon--save", // ä¿åæé® 534 closeAddonButton: ".f-cart-addon--close", // å ³éæé® 535 calcShippingButton: ".f-cart-addon--calculate", // 计ç®è¿è´¹æé® 536 triggerAddonButton: ".f-cart-addon--trigger-button", // 触åæé® 537 devliveryTime: '[name="attributes[Delivery time]"]', // é éæ¶é´ 538 }; 539 } 540 541 // å ç´ æå ¥DOMæ¶è°ç¨ 542 connectedCallback() { 543 // æ ¹æ®é¡µé¢ç±»å设置è´ç©è½¦å®¹å¨ 544 this.cartWrapper = document.querySelector(".f-cart-drawer"); 545 this.isCartPage = MinimogSettings.templateName === "cart"; 546 if (this.isCartPage) { 547 this.cartWrapper = document.querySelector(".f-cart__footer--wrapper"); 548 } 549 550 this.initAddress = false; // å°åæ¯å¦åå§åæ å¿ 551 this.cartOverlay = this.cartWrapper.querySelector(".f-cart__overlay"); // é®ç½©å± 552 this.domNodes = queryDomNodes(this.selectors, this); // è·åDOMèç¹ 553 this.rootUrl = '/'; // ååºæ ¹URL 554 this.discountCodeKey = "minimog-discount-code"; // ææ£ç æ¬å°åå¨é® 555 this.deliveryCodeKey = "minimog-delivery-code"; // é éæ¶é´æ¬å°åå¨é® 556 this.init(); // åå§å 557 } 558 559 // å ç´ ä»DOMç§»é¤æ¶è°ç¨ 560 disconnectedCallback() { 561 // ç§»é¤ææäºä»¶çå¬ 562 if (this._removeCloseAddonButton) this._removeCloseAddonButton(); 563 if (this._removeCalcShippingButton) this._removeCalcShippingButton(); 564 this.querySelectorAll(this.selectors.triggerAddonButton).forEac
564h((button) => { 565 button.removeEventListener('click', this.handleOpenAddon.bind(this)); 566 }); 567 this.querySelectorAll(this.selectors.saveAddonButton).forEach((button) => { 568 button.removeEventListener('click', this.handleSaveAddonValue.bind(this)); 569 }); 570 } 571 572 // åå§åæ¹æ³ 573 init() { 574 const {cartDiscountCode, cartDiscountCodeNoti, devliveryTime} = this.domNodes; 575 576 // 为ææè§¦åæé®æ·»å ç¹å»äºä»¶ 577 this.querySelectorAll(this.selectors.triggerAddonButton).forEach((button) => { 578 button.addEventListener('click', this.handleOpenAddon.bind(this)); 579 }); 580 581 // 为ææä¿åæé®æ·»å ç¹å»äºä»¶ 582 this.querySelectorAll(this.selectors.saveAddonButton).forEach((button) => { 583 button.addEventListener('click', this.handleSaveAddonValue.bind(this)); 584 }); 585 586 // æ·»å å ³éæé®äºä»¶å§æ 587 this._removeCloseAddonButton = addEventDelegate({ 588 selector: this.selectors.closeAddonButton, 589 context: this.cartWrapper, 590 handler: this.close.bind(this), 591 }); 592 593 // æ·»å 计ç®è¿è´¹æé®äºä»¶å§æ 594 this._removeCalcShippingButton = addEventDelegate({ 595 selector: this.selectors.calcShippingButton, 596 context: this.cartWrapper, 597 handler: this.calcShipping.bind(this), 598 }); 599 600 // 仿¬å°å卿¢å¤ææ£ç 601 if (cartDiscountCode) { 602 const code = localStorage.getItem(this.discountCodeKey); 603 if (code) { 604 cartDiscountCode.value = code; 605 if (cartDiscountCodeNoti) { 606 cartDiscountCodeNoti.style.display = "inline"; 607 } 608 } 609 } 610 611 // 仿¬å°å卿¢å¤é éæ¶é´ 612 if (devliveryTime) { 613 const code = localStorage.getItem(this.deliveryCodeKey); 614 if (code) devliveryTime.value = code; 615 } 616 617 // 设置é éæ¶é´éæ©å¨çæå°æ¥æä¸ºä»å¤© 618 const today = new Date().toISOString().slice(0, 16); 619 const deliveryTimeElm = this.querySelector("#delivery-time"); 620 if (deliveryTimeElm) deliveryTimeElm.min = today; 621 } 622 623 // å¤çæå¼éå åè½é¢æ¿ 624 handleOpenAddon(e) { 625 e.preventDefault(); 626 const {target} = e; 627 628 // å¨è´ç©è½¦é¡µé¢ï¼å ³éå ¶ä»å·²æå¼ç颿¿ 629 if (this.isCartPage) { 630 const addonCurrentActive = document.querySelector(".f-cart-addon__body.open"); 631 if (addonCurrentActive) addonCurrentActive.classList.remove("open"); 632 } 633 634 const {open: addonTarget} = target.dataset; 635 const addonNode = this.cartWrapper.querySelector(`#f-addons-${addonTarget}`); 636 637 // ç§»é¤æææé®çæ¿æ´»ç¶æ 638 this.removeActiveAllButton(); 639 640 // 设置å½åæé®å颿¿ä¸ºæ¿æ´»ç¶æ 641 target.classList.add("active"); 642 addonNode && addonNode.classList.add("open"); 643 this.cartOverlay && this.cartOverlay.classList.add("open"); 644 this.openAddon = addonNode; 645 646 // 妿æ¯è¿è´¹è®¡ç®é¢æ¿ï¼å è½½å½å®¶é项 647 if (addonTarget === "shipping") { 648 fetchSection("country-options", {url: window.MinimogSettings.base_url}) 649 .then((html) => { 650 const select = html.querySelector("#AddressCountry"); 651 const options = select && select.querySelectorAll("option"); 652 const defaultSelect = addonNode.querySelector("#MadrressCountry select"); 653 options && 654 options.forEach((option) => { 655 defaultSelect && defaultSelect.appendChild(option); 656 }); 657 this.setupCountries(); 658 defaultSelect.value = defaultSelect && defaultSelect.dataset.default; 659 }) 660 .catch(console.error); 661 } 662 } 663 664 // ç§»é¤ææè§¦åæé®çæ¿æ´»ç¶æ 665 removeActiveAllButton() { 666 const triggerButtons = this.querySelectorAll(this.selectors.triggerAddonButton); 667 triggerButtons && triggerButtons.forEach((button) => button.classList.remove("active"));
668 } 669 670 // åå§åå½å®¶/çä»½éæ©å¨ 671 setupCountries() { 672 if (this.initAddress) return; 673 if (Shopify && Shopify.CountryProvinceSelector) { 674 // 使ç¨Shopifyæä¾çå½å®¶/çä»½éæ©å¨ 675 new Shopify.CountryProvinceSelector("AddressCountry", "AddressProvince", { 676 hideElement: "AddressProvinceContainer", 677 }); 678 this.initAddress = true; 679 } 680 } 681 682 // å ³ééå åè½é¢æ¿ 683 close(event) { 684 event.preventDefault(); 685 this.openAddon.classList.remove("open"); 686 this.cartOverlay && this.cartOverlay.classList.remove("open"); 687 this.removeActiveAllButton(); 688 this.openAddon = null; 689 } 690 691 // 计ç®è¿è´¹ 692 calcShipping(event) { 693 event.preventDefault(); 694 const actionsWrapper = event.target.closest(".f-cart-addon__action"); 695 actionsWrapper.classList.add("f-spinner-loading"); // æ¾ç¤ºå è½½ç¶æ 696 697 // è·åè¾å ¥å¼ 698 const zipCode = this.domNodes.zipCode && this.domNodes.zipCode.value && this.domNodes.zipCode.value.trim(); 699 const country = this.domNodes.country.value; 700 const province = this.domNodes.province.value; 701 702 // éç½®è¿è´¹ä¿¡æ¯æ¾ç¤º 703 this.domNodes.shippingMessage.classList.remove("error"); 704 this.domNodes.shippingMessage.innerHTML = ""; 705 706 // æ¯å¦æ¾ç¤ºé éå¤©æ° 707 const showDeliveryDays = actionsWrapper.dataset.showDeliveryDays === "1"; 708 709 // åéè¿è´¹è®¡ç®è¯·æ± 710 fetch( 711 `${this.rootUrl}cart/shipping_rates.json?shipping_address%5Bzip%5D=${zipCode}&shipping_address%5Bcountry%5D=${country}&shipping_address%5Bprovince%5D=${province}` 712 ) 713 .then((res) => res.json()) 714 .then((res) => { 715 if (res && res.shipping_rates) { 716 const {shipping_rates} = res; 717 const {shippingRatesResult, noShippingRate} = MinimogStrings; 718 719 if (shipping_rates.length > 0) { 720 actionsWrapper.classList.remove("f-spinner-loading"); 721 const shippingLabel = document.createElement("P"); 722 shippingLabel.classList.add("f-cart-addon__shipping-rate--label"); 723 shippingLabel.innerHTML = `${shippingRatesResult.replace("{{count}}", shipping_rates.length)}:`; 724 this.domNodes.shippingMessage.appendChild(shippingLabel); 725 726 // æ¾ç¤ºæ¯ä¸ªè¿è´¹é项 727 shipping_rates.map((rate) => { 728 const {deliveryOne = "Day", deliveryOther = "Days"} = actionsWrapper.dataset; 729 let deliveryDays = ""; 730 731 // 妿æé é天æ°ä¿¡æ¯ 732 if (rate.delivery_days.length > 0 && showDeliveryDays) { 733 let textDay = deliveryOne; 734 const firstDeliveryDay = rate.delivery_days[0]; 735 const lastDeliveryDay = rate.delivery_days.at(-1); 736 if (firstDeliveryDay > 1) textDay = deliveryOther; 737 738 // æ ¼å¼åé éå¤©æ°æ¾ç¤º 739 if (firstDeliveryDay === lastDeliveryDay) { 740 deliveryDays = `(${firstDeliveryDay} ${textDay})`; 741 } else { 742 deliveryDays = `(${firstDeliveryDay} - ${lastDeliveryDay} ${textDay})`; 743 } 744 } 745 746 // å建è¿è´¹é项å ç´ 747 const shippingRateItem = document.createElement("P"); 748 shippingRateItem.classList.add("f-cart-addon__shipping-rate--item"); 749 shippingRateItem.innerHTML = `${rate.name}: <span>${rate.price} ${Shopify.currency.active}</span> ${deliveryDays}`; 750 this.domNodes.shippingMessage.appendChild(shippingRateItem); 751 }); 752 } else { 753 // 没æå¯ç¨è¿è´¹é项 754 actionsWrapper.classList.remove("f-spinner-loading"); 755 this.domNodes.shippingMessage.innerHTML = `<p>${noShippingRate}</p>`; 756 } 757 } else { 758 // æ¾ç¤ºéè¯¯ä¿¡æ¯ 759 actionsWrapper.classList.remove("f-spinner-loading"); 760 Object.entries(res).map((error) => { 761 this.domNodes.shippingMessage.classList.add(error[0] && error[0].toLowerCase()); 762 const message = `${error[1][0]}`; 763 const shippingRateError = document.createElement("P"); 764 shippingRateError.classList.add("f-cart-addon__shipping-rate--error"); 765 shippingRateError.innerHTML = `${message}<sup>*</sup>`; 766 this.domNodes.shippingMessage.appendChild(shippingRateError); 767 }); 768 } 769 }) 770 .catch(console.error); 771 } 772 773 // å¤çä¿åéå åè½å¼ 774 handleSaveAddonValue(e) { 775 e.preventDefault(); 776 const {target} = e; 777 const {cartDiscountCode, cartDiscountCodeNoti, devliveryTime} = this.domNodes; 778 779 // ææ£ç å¤ç 780 if (target.dataset.action === "coupon" && cartDiscountCode) { 781 const code = cartDiscountCode.value; 782 localStorage.setItem(this.discountCodeKey, code); // ä¿åå°æ¬å°åå¨ 783 784 // æ¾ç¤ºæéèææ£ç éç¥ 785 if (code !== "" && cartDiscountCodeNoti) { 786 cartDiscountCodeNoti.style.display = "inline"; 787 } else { 788 cartDiscountCodeNoti.style.display = "none"; 789 } 790 this.close(e); 791 } 792 793 // 夿³¨å¤ç 794 if (target.dataset.action === "note") { 795 this.updateCartNote(); 796 this.close(e); 797 } 798 799 // é éæ¶é´å¤ç 800 if (target.dataset.action === "delivery") { 801 const code = devliveryTime.value; 802 const isValidDate = Date.parse(code); 803 804 // éªè¯æ¥ææææ§ 805 if (isValidDate > Date.now()) { 806 localStorage.setItem(this.deliveryCodeKey, code); 807 this.close(e); 808 } else { 809 // æ ææ¥æå¤ç 810 localStorage.setItem(this.deliveryCodeKey, ""); 811 devliveryTime.value = ""; 812 window.MinimogTheme.Notification.show({ 813 target: this.querySelector(".f-cart-addon-message-error"), 814 method: "appendChild", 815 type: "error",
816 message: window.MinimogStrings.valideDateTimeDelivery, 817 last: 3000, 818 sticky: false, 819 }); 820 } 821 } 822 } 823 824 // æ´æ°è´ç©è½¦å¤æ³¨ 825 updateCartNote() { 826 const cartNoteValue = this.domNodes.cartNote.value; 827 const body = JSON.stringify({note: cartNoteValue}); 828 fetch(`${window.MinimogSettings.routes.cart_update_url}`, {...fetchConfig(), ...{body}}); 829 } 830 } 831 832 // 注åèªå®ä¹å ç´ 833 customElements.define("f-cart-addons", FCartAddons); 834} 835if (!customElements.get("fec-cart-checkout-button")) { 836 class FecCartCheckoutButton extends HTMLElement {//ä¾§æ è´ç©è½¦åè´ç©è½¦é¡µçç»è´¦æé® 837 connectedCallback() { 838 this.targetUrl = this.dataset.targetUrl; 839 this.productFormId = this.dataset.productFormId; 840 this.time = null 841 this.addEventListener('click', e => { 842 const button = this.querySelector('button'); 843 if (button && e.target === button) { 844 this.checkoutHandler(button); 845 } 846 }); 847 } 848 849 checkoutHandler(button) { 850 851 // 1. æ¾ç¤º loading 852 if (button.disabled === true) { 853 return; 854 } 855 button.disabled = true; 856 857 clearTimeout(this.time); 858 this.time = setTimeout(() => { 859 button.disabled = false; 860 }, 3000) 861 862 $log('ç¹å»ç»è´¦', this.targetUrl); 863 api.post('/api/checkout/order/cart-checkout', { 864 client_detail: fGetClientInfo() 865 }).then(res => { 866 window.location.href = $buildUrl(this.targetUrl , '/' + res.order_number) 867 }).catch((err) => { 868 if (err.code == '101108002') {//åºåä¸è¶³ 869 FecTheme.Notification.show({ 870 target: document.querySelector('.checkout-error-wrapper'), 871 method: "appendChild", 872 type: "error", 873 message: this.dataset.soldOut, 874 delay: 100, 875 }) 876 } else if (err.code == '101108001') {//ç¶æä¸æ¶ï¼æè 产å被å é¤ 877 FecTheme.Notification.show({ 878 target: document.querySelector('.checkout-error-wrapper'), 879 method: "appendChild", 880 type: "error", 881 message: this.dataset.notAvailable, 882 delay: 100, 883 }) 884 } else if (err.code == '101000012' || err.code == '101000013') { 885 FecTheme.Notification.show({ 886 target: document.querySelector('.checkout-error-wrapper'), 887 method: "appendChild", 888 type: "error", 889 message: err.message || 'The conditions are not met.', 890 delay: 100, 891 }) 892 } else { 893 FecTheme.Notification.show({ 894 target: document.querySelector('.checkout-error-wrapper'), 895 method: "appendChild", 896 type: "error", 897 message: err.message || 'The conditions are not met.', 898 delay: 100, 899 }) 900 } 901 }).finally(() => { 902 button.disabled = false 903 }) 904 } 905 } 906 907 customElements.define('fec-cart-checkout-button', FecCartCheckoutButton); 908 909}
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.