ScuttleBot
feat: select-all checkbox in agent list header
Commit
30e53110edb0698146d4f8d05d16e55f9b4056382367e78cc0eb9cc329b799c5
Parent
50ba2ecd6edac82…
1 file changed
+5
-1
+5
-1
| --- internal/api/ui/index.html | ||
| +++ internal/api/ui/index.html | ||
| @@ -1690,11 +1690,11 @@ | ||
| 1690 | 1690 | <button class="sm danger" onclick="deleteAgent('${esc(a.nick)}')">delete</button></div></td> |
| 1691 | 1691 | </tr>`; |
| 1692 | 1692 | }); |
| 1693 | 1693 | renderTable('agents-container', null, rows, |
| 1694 | 1694 | bots.length ? 'no agents match the filter' : 'no agents registered yet', |
| 1695 | - ['nick','type','channels','last seen','']); | |
| 1695 | + ['<input type="checkbox" id="agent-select-all" onchange="toggleSelectAllAgents(this.checked)" style="margin-right:6px">nick','type','channels','last seen','']); | |
| 1696 | 1696 | } |
| 1697 | 1697 | |
| 1698 | 1698 | async function revokeAgent(nick) { |
| 1699 | 1699 | if (!confirm(`Revoke "${nick}"? This cannot be undone.`)) return; |
| 1700 | 1700 | try { await api('POST', `/v1/agents/${nick}/revoke`); await loadAgents(); await loadStatus(); } |
| @@ -1702,10 +1702,14 @@ | ||
| 1702 | 1702 | } |
| 1703 | 1703 | async function deleteAgent(nick) { |
| 1704 | 1704 | if (!confirm(`Delete "${nick}"? This permanently removes the agent from the registry.`)) return; |
| 1705 | 1705 | try { await api('DELETE', `/v1/agents/${nick}`); await loadAgents(); await loadStatus(); } |
| 1706 | 1706 | catch(e) { alert('Delete failed: '+e.message); } |
| 1707 | +} | |
| 1708 | +function toggleSelectAllAgents(checked) { | |
| 1709 | + document.querySelectorAll('.agent-select').forEach(cb => cb.checked = checked); | |
| 1710 | + updateBulkBtn(); | |
| 1707 | 1711 | } |
| 1708 | 1712 | function updateBulkBtn() { |
| 1709 | 1713 | const checked = document.querySelectorAll('.agent-select:checked'); |
| 1710 | 1714 | const btn = document.getElementById('bulk-delete-btn'); |
| 1711 | 1715 | btn.style.display = checked.length > 0 ? '' : 'none'; |
| 1712 | 1716 |
| --- internal/api/ui/index.html | |
| +++ internal/api/ui/index.html | |
| @@ -1690,11 +1690,11 @@ | |
| 1690 | <button class="sm danger" onclick="deleteAgent('${esc(a.nick)}')">delete</button></div></td> |
| 1691 | </tr>`; |
| 1692 | }); |
| 1693 | renderTable('agents-container', null, rows, |
| 1694 | bots.length ? 'no agents match the filter' : 'no agents registered yet', |
| 1695 | ['nick','type','channels','last seen','']); |
| 1696 | } |
| 1697 | |
| 1698 | async function revokeAgent(nick) { |
| 1699 | if (!confirm(`Revoke "${nick}"? This cannot be undone.`)) return; |
| 1700 | try { await api('POST', `/v1/agents/${nick}/revoke`); await loadAgents(); await loadStatus(); } |
| @@ -1702,10 +1702,14 @@ | |
| 1702 | } |
| 1703 | async function deleteAgent(nick) { |
| 1704 | if (!confirm(`Delete "${nick}"? This permanently removes the agent from the registry.`)) return; |
| 1705 | try { await api('DELETE', `/v1/agents/${nick}`); await loadAgents(); await loadStatus(); } |
| 1706 | catch(e) { alert('Delete failed: '+e.message); } |
| 1707 | } |
| 1708 | function updateBulkBtn() { |
| 1709 | const checked = document.querySelectorAll('.agent-select:checked'); |
| 1710 | const btn = document.getElementById('bulk-delete-btn'); |
| 1711 | btn.style.display = checked.length > 0 ? '' : 'none'; |
| 1712 |
| --- internal/api/ui/index.html | |
| +++ internal/api/ui/index.html | |
| @@ -1690,11 +1690,11 @@ | |
| 1690 | <button class="sm danger" onclick="deleteAgent('${esc(a.nick)}')">delete</button></div></td> |
| 1691 | </tr>`; |
| 1692 | }); |
| 1693 | renderTable('agents-container', null, rows, |
| 1694 | bots.length ? 'no agents match the filter' : 'no agents registered yet', |
| 1695 | ['<input type="checkbox" id="agent-select-all" onchange="toggleSelectAllAgents(this.checked)" style="margin-right:6px">nick','type','channels','last seen','']); |
| 1696 | } |
| 1697 | |
| 1698 | async function revokeAgent(nick) { |
| 1699 | if (!confirm(`Revoke "${nick}"? This cannot be undone.`)) return; |
| 1700 | try { await api('POST', `/v1/agents/${nick}/revoke`); await loadAgents(); await loadStatus(); } |
| @@ -1702,10 +1702,14 @@ | |
| 1702 | } |
| 1703 | async function deleteAgent(nick) { |
| 1704 | if (!confirm(`Delete "${nick}"? This permanently removes the agent from the registry.`)) return; |
| 1705 | try { await api('DELETE', `/v1/agents/${nick}`); await loadAgents(); await loadStatus(); } |
| 1706 | catch(e) { alert('Delete failed: '+e.message); } |
| 1707 | } |
| 1708 | function toggleSelectAllAgents(checked) { |
| 1709 | document.querySelectorAll('.agent-select').forEach(cb => cb.checked = checked); |
| 1710 | updateBulkBtn(); |
| 1711 | } |
| 1712 | function updateBulkBtn() { |
| 1713 | const checked = document.querySelectorAll('.agent-select:checked'); |
| 1714 | const btn = document.getElementById('bulk-delete-btn'); |
| 1715 | btn.style.display = checked.length > 0 ? '' : 'none'; |
| 1716 |