Settings bans card: unban also requires confirmation
This commit is contained in:
+20
-5
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user