| 13847 | function displayPwnNetworksTable(networks) { |
| 13848 | const container = document.getElementById('pwn-networks-table'); |
| 13849 | if (!container) return; |
| 13850 | |
| 13851 | if (!Array.isArray(networks) || networks.length === 0) { |
| 13852 | container.innerHTML = '<p class="text-gray-400">No Pwnagotchi captures found yet.</p>'; |
| 13853 | return; |
| 13854 | } |
| 13855 | |
| 13856 | const previewCount = 10; |
| 13857 | const hasMore = networks.length > previewCount; |
| 13858 | const previewItems = networks.slice(0, previewCount); |
| 13859 | const hiddenItems = hasMore ? networks.slice(previewCount) : []; |
| 13860 | |
| 13861 | /* --- Mobile card layout (shown < md) --- */ |
| 13862 | function networkCardHTML(net) { |
| 13863 | const ssid = escapeHtml(net.ssid || 'Unknown'); |
| 13864 | const bssid = escapeHtml(net.bssid || 'Unknown'); |
| 13865 | const lastSeen = net.last_seen ? formatTimestamp(net.last_seen) : 'Unknown'; |
| 13866 | return ` |
| 13867 | <div class="bg-slate-800 bg-opacity-60 rounded-lg p-4"> |
| 13868 | <div class="flex items-start justify-between gap-2 mb-2"> |
| 13869 | <span class="text-white font-semibold text-sm break-all">${ssid}</span> |
| 13870 | <span class="text-xs text-gray-400 whitespace-nowrap">${lastSeen}</span> |
| 13871 | </div> |
| 13872 | <div class="text-xs text-gray-400 font-mono mb-2">${bssid}</div> |
| 13873 | <div class="flex flex-wrap gap-1 mb-1">${_pwnBadgesHTML(net)}</div> |
| 13874 | <div class="text-xs mt-1">${_pwnGpsHTML(net)}</div> |
| 13875 | ${_pwnFilesHTML(net.files)} |
| 13876 | </div>`; |
| 13877 | } |
| 13878 | |
| 13879 | /* --- Desktop table row (shown >= md) --- */ |
| 13880 | function networkRowHTML(net) { |
| 13881 | const ssid = escapeHtml(net.ssid || 'Unknown'); |
| 13882 | const bssid = escapeHtml(net.bssid || 'Unknown'); |
| 13883 | const lastSeen = net.last_seen ? formatTimestamp(net.last_seen) : 'Unknown'; |