Smart Casual Knitwear
9:41
Home
Kategori
Belanja
Ulasan
Akun
Filter Produk Reset Semua
Harga
Di bawah Rp 300k Rp 300k – 400k Di atas Rp 400k
Ukuran
S
M
L
XL
Warna
Ketersediaan
Tersedia Habis Terjual
Label Produk
New Arrival Promo Terlaris
Urutkan Produk Tutup
Panduan Ukuran Tutup
Tabel Ukuran
Rekomendasi Untukku
Dimensi aktual produk (diratakan), dalam cm. Baris berwarna = ukuran kamu saat ini.
UkuranDadaPanjangLingkar DadaTangan
S486688–9259
M ✓506892–9660
L537096–10061
XL5672100–10662
XXL5974106–11263
3XL6276112–11864
4XL6578118–12465
Cara mengukur tubuh
Lebar DadaTepi kiri ke kanan dada
PanjangTengkuk ke ujung bawah
Lingkar DadaMelingkari bagian terlebar dada
TanganDari pundak ke ujung lengan
`; // Buka window baru dan tulis HTML const win = window.open('', '_blank', 'width=420,height=720'); if(!win){ alert('⚠️ Browser memblokir popup. Izinkan popup untuk site ini lalu coba lagi.'); return; } win.document.write(labelHtml); win.document.close(); } // Helper: build HTML body untuk 1 label (tanpa wrapper html/head/style) // Dipakai oleh _bulkPrintLabels untuk concat banyak label dalam 1 window function _buildLabelBodyHtml(o){ // Compose product list dari order let productItems = []; let totalQty = 0; const _processProducts = (arr) => { arr.forEach(p => { const qty = p.qty || 1; totalQty += qty; let label = p.name || p.title || 'Produk'; const variants = []; if(p.color || p.warna) variants.push(p.color || p.warna); if(p.size || p.ukuran) variants.push(p.size || p.ukuran); if(variants.length > 0) label += ' (' + variants.join('/') + ')'; productItems.push({ label: label, qty: qty }); }); }; if(Array.isArray(o.products) && o.products.length > 0){ _processProducts(o.products); } else if(Array.isArray(o.items) && o.items.length > 0){ _processProducts(o.items); } const productsHtml = productItems.length > 0 ? productItems.map(p => `
${_escHtml(p.label)}×${p.qty}
`).join('') : '
Detail produk tidak tersedia
'; const _fmtDate = (d) => { if(!d) return '—'; try { const dt = (d instanceof Date) ? d : new Date(d); if(isNaN(dt.getTime())) return d; return dt.toLocaleDateString('id-ID', {day:'2-digit', month:'short', year:'numeric'}); } catch(e) { return d; } }; const tglPesan = _fmtDate(o.createdAt || o.date || o.dateStr); const tglProses = new Date().toLocaleDateString('id-ID', {day:'2-digit', month:'short', year:'numeric'}); const namaCustomer = (o.nama || o.name || 'Customer').trim(); const phoneCustomer = (o.phone || o.hp || '').trim(); const addrCustomer = (o.addr || o.address || '').trim(); const senderAddr = 'Jl. Jurang No.103, Pasteur, Sukajadi,\nBandung, Jawa Barat 40161'; const senderPhone = SETTINGS.waAdminNumber || SETTINGS.kontakWaNumber || '0813-2258-4740'; const senderName = SETTINGS.tokoName || 'Gomuda Knitwear'; return `
No. Pesanan
${_escHtml(o.id||'')}
Tgl. Pesan: ${tglPesan}
Tgl. Proses: ${tglProses}
PENGIRIM
${_escHtml(senderName)}
${senderAddr.split('\n').map(line => _escHtml(line)).join('
')}
HP: ${_escHtml(senderPhone)}
KEPADA
${_escHtml(namaCustomer)}
${_escHtml(addrCustomer)}
HP: ${_escHtml(phoneCustomer)}
DETAIL PESANAN
${productsHtml}
Total Item ${totalQty} pcs
`; } // Bulk print label: cetak beberapa label sekaligus dalam 1 window (auto page-break) function _bulkPrintLabels(){ const selected = window._adminOrderSelected; if(!selected || selected.size === 0){ showToast('⚠️ Pilih pesanan dulu untuk di-print'); return; } // Cari order objects dari ORDERS array berdasarkan ID yang dipilih const ordersToPrint = ORDERS.filter(o => o && selected.has(o.id)); if(ordersToPrint.length === 0){ showToast('⚠️ Pesanan tidak ditemukan'); return; } // Build all labels HTML const allLabelsHtml = ordersToPrint.map(o => _buildLabelBodyHtml(o)).join('\n'); // CSS sama dengan single print, tapi dengan @page khusus thermal & label punya page-break const fullHtml = ` Bulk Print Label - ${ordersToPrint.length} Pesanan
Bulk Print: ${ordersToPrint.length} Label Pengiriman 10×15 cm
${allLabelsHtml}