/** 举报与禁封申诉审核。仅在对应 native 后台页入队。 */ (function () { 'use strict'; var root = document.querySelector('.aksrt-ban-page'); var dialog = document.getElementById('aksrt-ban-dialog'); if (!root || !dialog || typeof dialog.showModal !== 'function') return; var opener = null; var activeForm = null; var submitting = false; var pointerStartedOutside = false; function lockScroll() { document.documentElement.classList.toggle('aksrt-ban-modal-open', !!dialog.open); } function attribute(element, name) { return element ? element.getAttribute(name) || '' : ''; } function selectedDecision(form) { var radios = form.querySelectorAll('input[type="radio"]'); for (var index = 0; index < radios.length; index += 1) { if (radios[index].checked) return radios[index].value; } return ''; } function syncReview(form) { if (submitting) return; var decision = selectedDecision(form); var rejected = decision === 'reject' || decision === 'dismissed'; var note = form.querySelector('textarea[name="note"]'); var label = form.querySelector('[data-aksrt-ban-note-label]'); var submit = form.querySelector('[data-aksrt-ban-submit]'); if (note) { note.required = rejected; note.setCustomValidity(rejected && !note.value.trim() ? attribute(note, 'data-required-error') : ''); } if (label) label.textContent = attribute(label, rejected ? 'data-required' : 'data-optional'); if (submit) { submit.disabled = !decision; submit.textContent = attribute(submit, decision ? (rejected ? 'data-reject-label' : 'data-approve-label') : 'data-idle-label'); submit.classList.toggle('is-danger', rejected); } } function setActionsDisabled(disabled) { dialog.querySelectorAll('[data-aksrt-ban-submit], [data-aksrt-dialog-close]').forEach(function (button) { button.disabled = disabled; }); } function setupReview(form) { form.querySelectorAll('input[type="radio"]').forEach(function (radio) { radio.checked = false; }); var note = form.querySelector('textarea[name="note"]'); if (note) note.value = ''; syncReview(form); form.addEventListener('input', function () { syncReview(form); }); form.addEventListener('change', function () { syncReview(form); }); form.addEventListener('submit', function (event) { if (submitting || form.dataset.submitting === '1') { event.preventDefault(); return; } syncReview(form); if (!selectedDecision(form) || !form.reportValidity()) { event.preventDefault(); return; } submitting = true; form.dataset.submitting = '1'; form.setAttribute('aria-busy', 'true'); setActionsDisabled(true); var submit = form.querySelector('[data-aksrt-ban-submit]'); if (submit) submit.textContent = attribute(submit, 'data-busy-label'); }); } root.querySelectorAll('[data-aksrt-ban-view]').forEach(function (button) { button.addEventListener('click', function (event) { event.preventDefault(); if (submitting || dialog.open) return; var template = document.getElementById('aksrt-ban-detail-' + attribute(button, 'data-aksrt-ban-view')); if (!template || !template.content) return; dialog.replaceChildren(template.content.cloneNode(true)); opener = button; pointerStartedOutside = false; activeForm = dialog.querySelector('form[data-aksrt-ban-review]'); if (activeForm) setupReview(activeForm); dialog.showModal(); lockScroll(); }); }); function isOutside(event) { var rect = dialog.getBoundingClientRect(); return event.clientX < rect.left || event.clientX > rect.right || event.clientY < rect.top || event.clientY > rect.bottom; } dialog.addEventListener('pointerdown', function (event) { pointerStartedOutside = event.target === dialog && isOutside(event); }); dialog.addEventListener('pointercancel', function () { pointerStartedOutside = false; }); dialog.addEventListener('click', function (event) { var close = event.target.closest('[data-aksrt-dialog-close]'); if (close || (pointerStartedOutside && event.target === dialog && isOutside(event))) { event.preventDefault(); if (!submitting) dialog.close(); } pointerStartedOutside = false; }); dialog.addEventListener('cancel', function (event) { event.preventDefault(); if (!submitting) dialog.close(); }); dialog.addEventListener('close', function () { dialog.replaceChildren(); activeForm = null; submitting = false; pointerStartedOutside = false; lockScroll(); var previousOpener = opener; opener = null; if (previousOpener && previousOpener.isConnected) previousOpener.focus(); }); window.addEventListener('pageshow', function () { submitting = false; if (activeForm) { delete activeForm.dataset.submitting; activeForm.removeAttribute('aria-busy'); setActionsDisabled(false); syncReview(activeForm); } lockScroll(); }); })();