PageSourceSearch

https://binderim.com/js/vendor/orders-outofstock-warn.hf0k1neqe5.js

js binderim.com collected 2026-10-02 01:28:48 UTC 5,756 bytes, 157 lines download raw bytes

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.