56 lines
1.8 KiB
JavaScript
56 lines
1.8 KiB
JavaScript
// Announcements admin page: intercepts the status badge's toggle form so
|
||
// clicking it updates in place via fetch instead of reloading the whole
|
||
// page — same interaction as the menu item's status toggle. Everything
|
||
// else here (create/edit/delete) is still a plain form POST + reload.
|
||
|
||
document.addEventListener('submit', async (e) => {
|
||
const form = e.target;
|
||
if (!form.classList.contains('status-toggle-form')) return;
|
||
|
||
e.preventDefault();
|
||
const btn = form.querySelector('button');
|
||
btn.disabled = true;
|
||
|
||
try {
|
||
const response = await fetch('index.php', {
|
||
method: 'POST',
|
||
body: new FormData(form),
|
||
headers: { 'X-Requested-With': 'XMLHttpRequest' }
|
||
});
|
||
const data = await response.json();
|
||
|
||
if (data.success) {
|
||
btn.className = `status-badge ${data.status_class}`;
|
||
btn.textContent = data.status_label;
|
||
btn.title = `Click to turn ${data.is_active ? 'off' : 'on'}`;
|
||
} else {
|
||
alert(data.error || 'Failed to update status.');
|
||
}
|
||
} catch {
|
||
alert('Network error. Please try again.');
|
||
} finally {
|
||
btn.disabled = false;
|
||
}
|
||
});
|
||
|
||
// Asks before submitting any form marked .js-confirm-submit (e.g. delete),
|
||
// using the message in its data-confirm attribute.
|
||
document.addEventListener('submit', (e) => {
|
||
const form = e.target;
|
||
if (!form.classList.contains('js-confirm-submit')) return;
|
||
if (!confirm(form.dataset.confirm || 'Are you sure?')) {
|
||
e.preventDefault();
|
||
}
|
||
});
|
||
|
||
// Announcement editor dialog: the server flags it for ?new / ?edit URLs.
|
||
// Closing it any way (× link, Esc) drops the query string, so a reload
|
||
// doesn't reopen it.
|
||
const annModal = document.getElementById('modal-ann');
|
||
if (annModal?.hasAttribute('data-open-on-load')) {
|
||
annModal.showModal();
|
||
annModal.addEventListener('close', () => {
|
||
history.replaceState(null, '', 'index.php');
|
||
});
|
||
}
|