/* ─── BOM Detail Expansion ─── */ function renderBomDetails(b) { let html = '
'; return html; } function toggleEquipGroup(id) { const group = document.getElementById(id); const icon = document.getElementById(id + '-icon'); if (!group) return; group.classList.toggle('collapsed'); if (icon) icon.classList.toggle('open', !group.classList.contains('collapsed')); } function toggleBomRow(id) { const row = document.getElementById(id); const icon = document.getElementById(id + '-icon'); if (!row) return; const visible = row.style.display !== 'none'; row.style.display = visible ? 'none' : ''; if (icon) icon.classList.toggle('open', !visible); } /* ─── Cut List Modal ─── */ function showCutListModal(bomItems) { const cutItems = bomItems.filter(b => b.cutTemplate); if (cutItems.length === 0) { showToast('No cut templates found'); return; } const rows = cutItems.map(b => { const ct = b.cutTemplate; const name = ct.cutTemplateName || ct.dxfFilePath?.split(/[/\\]/).pop()?.replace(/\.dxf$/i, '') || b.partName || ''; const qty = b.qty ?? ''; return { name, qty }; }); const tableRows = rows.map((r, i) => `| Name | Qty |
|---|