📋 Daftar Item (Non-Laptop)

Semua kode item selain SCU (contoh: SHU = Handphone, SCUP = Part). Sumber: vkios, ipos, warehouse, input → sheet masternonlaptop.
Per halaman
SKU (kode item)
Nama Barang
Prefix
#
Harga Jual
HPP (IPOS)
Stock (IPOS)
Stock Orig
Gudang Tujuan
Rak Tujuan
Barcode
URL
NEW
Last Date
Last Time
Sold
Gambar
Memuat…
${thead}${tbody}
`; const blob = new Blob([html], {type:'application/vnd.ms-excel;charset=utf-8;'}); const a = document.createElement('a'); const d = new Date(); a.href = URL.createObjectURL(blob); a.download = `masternonlaptop_${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}.xls`; document.body.appendChild(a); a.click(); a.remove(); } // ===== Events ===== document.getElementById('btnSearch').addEventListener('click', ()=>{ applyFilterAndSort(); render(); }); document.getElementById('q').addEventListener('keydown', e=>{ if(e.key==='Enter'){ applyFilterAndSort(); render(); } }); document.getElementById('prefix').addEventListener('change', ()=>{ applyFilterAndSort(); render(); }); document.getElementById('pageSize').addEventListener('change', (e)=>{ D.pageSize=parseInt(e.target.value,10)||25; D.page=1; render(); }); document.getElementById('prevPage').addEventListener('click', ()=>{ D.page=Math.max(1,D.page-1); render(); }); document.getElementById('nextPage').addEventListener('click', ()=>{ const pages = Math.max(1, Math.ceil(D.filtered.length / D.pageSize)); D.page=Math.min(pages,D.page+1); render(); }); document.getElementById('btnRebuild').addEventListener('click', async ()=>{ const btn = document.getElementById('btnRebuild'); btn.disabled = true; btn.textContent='Rebuilding...'; try{ const r = await apiRebuild(); btn.textContent = r.ok ? `Sukses (${r.written})` : 'Gagal'; await initialLoad(); }catch(err){ btn.textContent = 'Error'; }finally{ setTimeout(()=>{ btn.disabled=false; btn.textContent='Rebuild Master Non-Laptop'; }, 1200); } }); document.getElementById('btnCSV').addEventListener('click', exportCSV); document.getElementById('btnXLS').addEventListener('click', exportXLS); // Sorting (klik header, kecuali resizer) document.querySelectorAll('thead th.sortable').forEach(th=>{ th.addEventListener('click', (ev)=>{ if (ev.target && ev.target.classList.contains('resizer')) return; const key=th.getAttribute('data-key'); if(!key) return; sortBy(key); }); }); function updateSortDefault(){ D.sortKey='code_num'; D.sortDir='desc'; updateSortIndicators(); } async function initialLoad(){ const res = await apiList({limit:6000}); D.all = (res && res.ok)?(res.rows||[]):[]; updateSortDefault(); applyFilterAndSort(); render(); } initialLoad();