(m)
| 2113 | ${img ? '<h2>Heatmap</h2>' + img : ''} |
| 2114 | ${bands ? '<h2>Bands & channel plan</h2>' + bands : ''} |
| 2115 | ${intf ? '<h2>Interference</h2>' + intf : ''} |
| 2116 | ${issues.length ? '<h2>Security issues (' + issues.length + ')</h2><ul>' + issues.map(a => `<li><b>${_esc(a.ssid) || 'hidden'}</b> (${_esc(a.bssid)}): ${_esc(a.security_findings.join('; '))}</li>`).join('') + '</ul>' : ''} |
| 2117 | <h2>AP inventory</h2> |
| 2118 | <table><thead><tr><th>SSID</th><th>BSSID</th><th>Vendor</th><th>Band</th><th>Ch</th><th>Width</th><th>RSSI</th><th>SNR</th><th>Security</th></tr></thead><tbody>${rows}</tbody></table> |
| 2119 | <div class="foot">Generated by Ragnar WiFi Analyzer. Passive survey — estimates, not survey-grade measurements.</div> |
| 2120 | <script>window.onload=function(){setTimeout(function(){window.print();},250);};<\/script> |
| 2121 | </body></html>`; |
| 2122 | const w = window.open('', '_blank'); |
| 2123 | if (!w) { alert('Allow pop-ups to generate the report.'); return; } |
| 2124 | w.document.open(); w.document.write(html); w.document.close(); |
| 2125 | } |
no test coverage detected