1/* âââ Vendor Orders: "Stokta Yok" iÅaretleme uyarı modal'ı âââ 2 Vendor "Stokta Yok" durumunu seçip submit ettiÄinde modal'ı açar; satıcı uyarıları 3 kabul edip onaylayana kadar form gönderilmez. Tek/bulk form ayrımı yok â `data-vo-oos-guard` 4 attribute'u olan tüm formları kapsar. Form içindeki ilk `select[name="action"]`'a bakar. */ 5(function () { 6 'use strict'; 7 8 // m2 (review, #1585 en-links-followup) -- path-base.js her sayfada YUKLENMEYEBILIR 9 // (sira/kapsam garantisi yok); window.BinderimPathBase tanimsizsa TypeError firlatip butun 10 // dosyayi durdurmesin diye guvenli yerel referans (fallback path'i OLDUGU GIBI dondurur). 11 const oowPb = window.BinderimPathBase || { url: function (p) { return p; } }; 12 13 const modal = document.getElementById('voOosModal'); 14 if (!modal) { 15 return; 16 } 17 18 let pendingForm = null; 19 let pendingBuyerUserId = ''; 20 let pendingBuyerPaid = false; 21 22 const refundPanel = modal.querySelector('[data-vo-oos-refund]'); 23 const autoRefundPanel = modal.querySelector('[data-vo-oos-auto-refund]'); 24 const messageBtn = modal.querySelector('[data-vo-oos-message]'); 25 const confirmBtn = modal.querySelector('[data-vo-oos-confirm]'); 26 const cancelButtons = modal.querySelectorAll('[data-vo-oos-cancel]'); 27 28 const isOutOfStockAction = (form) => { 29 const actionSelect = form.querySelector('select[name="action"]'); 30 if (!actionSelect) return false; 31 const value = (actionSelect.value || '').trim().toLowerCase(); 32 return value === 'outofstock' || value === 'out_of_stock' || value === 'out-of-stock'; 33 }; 34 35 const openModal = (form) => { 36 pendingForm = form; 37 pendingBuyerPaid = (form.getAttribute('data-buyer-paid') || '').toLowerCase() === 'true'; 38 pendingBuyerUserId = form.getAttribute('data-buyer-user-id') || ''; 39 // Yalnız havalede iadeyi satıcı yapar. Kart rayında para emanette durur ve stokta yok 40 // kalemin payı alıcıya otomatik iade edilir â orada "iadeyi siz yapın" kutusu YANLIÅ olur. 41 // Nitelik yoksa (eski önbellekli sayfa) eski davranıŠkorunur. 42 const sellerRefunds = (form.getAttribute('data-seller-refunds') || 'true').toLowerCase() === 'true'; 43 44 if (refundPanel) { 45 if (pendingBuyerPaid && sellerRefunds) { 46 refundPanel.removeAttribute('hidden'); 47 } else { 48 refundPanel.setAttribute('hidden', ''); 49 } 50 } 51 52 if (autoRefundPanel) { 53 if (pendingBuyerPaid && !sellerRefunds) { 54 autoRefundPanel.removeAttribute('hidden'); 55 } else { 56 autoRefundPanel.setAttribute('hidden', ''); 57 } 58 } 59 60 if (messageBtn) { 61 if (pendingBuyerPaid && sellerRefunds && pendingBuyerUserId) { 62 messageBtn.removeAttribute('hidden'); 63 } else { 64 messageBtn.setAttribute('hidden', ''); 65 } 66 } 67 68 modal.classList.add('active'); 69 document.body.style.overflow = 'hidden'; 70 }; 71 72 const closeModal = () => { 73 modal.classList.remove('active'); 74 document.body.style.overflow = ''; 75 pendingForm = null; 76 pendingBuyerUserId = ''; 77 pendingBuyerPaid = false; 78 }; 79 80 // Form submission interception. Capture phase + return false ensures we run before default submit. 81 document.addEventListener('submit', (event) => { 82 const form = event.target; 83 if (!(form instanceof HTMLFormElement)) { 84 return; 85 } 86 87 if (!form.hasAttribute('data-vo-oos-guard')) { 88 return; 89 } 90 91 if (form.dataset.voOosConfirmed === 'true') { 92 // Modal'da onaylanmıŠâ submit'e devam. 93 return; 94 } 95 96 if (!isOutOfStockAction(form)) { 97 return; 98 } 99 100 event.preventDefault(); 101 openModal(form); 102 }, true); 103 104 if (confirmBtn) { 105 confirmBtn.addEventListener('click', () => { 106 if (!pendingForm) { 107 closeModal(); 108 return; 109 } 110 // Onaylandı flag'ini set et ve submit'i yeniden tetikle. 111 pendingForm.dataset.voOosConfirmed = 'true'; 112 const formToSubmit = pendingForm; 113 closeModal(); 114 // requestSubmit standard'a uygun; tetiklendiÄi anda submit event tekrar atılır, 115 // bu kez data-vo-oos-confirmed=true olduÄu için intercept etmiyoruz. 116 if (typeof formToSubmit.requestSubmit === 'function') { 117 formToSubmit.requestSubmit(); 118 } else { 119 formToSubmit.submit(); 120 } 121 }); 122 } 123 124 cancelButtons.forEach((btn) => { 125 btn.addEventListener('click', () => { 126 closeModal(); 127 }); 128 }); 129 130 // Overlay'e tıklayınca kapat (modal panel kendisi event'i bubble etmez). 131 modal.addEventListener('click', (event) => { 132 if (event.target === modal) { 133 closeModal(); 134 } 135 }); 136
137 // ESC ile kapatma. 138 document.addEventListener('keydown', (event) => { 139 if (event.key === 'Escape' && modal.classList.contains('active')) { 140 event.stopPropagation(); 141 closeModal(); 142 } 143 }); 144 145 if (messageBtn) { 146 messageBtn.addEventListener('click', () => { 147 if (!pendingBuyerUserId) { 148 return; 149 } 150 if (window.binderimMessages) { 151 window.binderimMessages.openWithUser(pendingBuyerUserId); 152 return; 153 } 154 window.location.href = oowPb.url('/?msgUser=' + encodeURIComponent(pendingBuyerUserId)); 155 }); 156 } 157})();
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.