Settings bans card: unban also requires confirmation

This commit is contained in:
dev
2026-09-12 01:06:24 +03:00
parent e69426882a
commit c54a5b180c
+20 -5
View File
@@ -246,18 +246,33 @@ async function loadBans() {
const bans = await res.json(); const bans = await res.json();
if (!bans.length) { el.innerHTML = '<span class="chip">Активных блокировок нет</span>'; return; } if (!bans.length) { el.innerHTML = '<span class="chip">Активных блокировок нет</span>'; return; }
el.innerHTML = bans.map(b => ` el.innerHTML = bans.map(b => `
<span class="chip"> <span class="chip" data-chip="${esc(b.ip)}">
<b>${esc(b.ip)}</b> — ${esc(b.reason)} до ${new Date(b.banned_until).toLocaleString('ru')} <b>${esc(b.ip)}</b> — ${esc(b.reason)} до ${new Date(b.banned_until).toLocaleString('ru')}
<button type="button" data-unban="${esc(b.ip)}" title="Разблокировать" style="background:none;border:none;color:var(--primary);cursor:pointer;font-weight:700">✕</button> <button type="button" data-unban="${esc(b.ip)}" title="Разблокировать" style="background:none;border:none;color:var(--primary);cursor:pointer;font-weight:700">✕</button>
</span>`).join(''); </span>`).join('');
} }
document.getElementById('bansList').addEventListener('click', async e => { async function doUnban(ip) {
const res = await fetch(`${API}/api/bans/${encodeURIComponent(ip)}`, { method: 'DELETE', headers: hdr() });
if (res.ok) { showToast('IP разблокирован: ' + ip); loadBans(); }
else showToast('Ошибка разблокировки');
}
document.getElementById('bansList').addEventListener('click', e => {
const ip = e.target.closest('[data-unban]')?.dataset.unban; const ip = e.target.closest('[data-unban]')?.dataset.unban;
if (!ip) return; if (!ip) return;
const res = await fetch(`${API}/api/bans/${encodeURIComponent(ip)}`, { method: 'DELETE', headers: hdr() }); const chip = e.target.closest('[data-chip]');
if (res.ok) { showToast('IP разблокирован'); loadBans(); } if (chip.dataset.confirming) return;
else showToast('Ошибка разблокировки'); chip.dataset.confirming = '1';
chip.style.background = 'rgba(239,68,68,.08)';
e.target.outerHTML = `
<span style="white-space:nowrap">
Убрать из блокировки?
<button type="button" data-unban-yes style="background:none;border:none;color:#16a34a;cursor:pointer;font-weight:700">Да</button>
<button type="button" data-unban-no style="background:none;border:none;color:var(--muted);cursor:pointer;font-weight:700">Нет</button>
</span>`;
chip.querySelector('[data-unban-yes]').addEventListener('click', () => doUnban(ip));
chip.querySelector('[data-unban-no]').addEventListener('click', () => loadBans());
}); });
document.getElementById('backupBtn').addEventListener('click', downloadBackup); document.getElementById('backupBtn').addEventListener('click', downloadBackup);