feat(widgets): plate moderator apply modal + JS submit
Replace bare apply link with modal form posting to forum moderator REST; empty/admin states and modal CSS.
This commit is contained in:
@@ -2565,3 +2565,38 @@ a.main-color > .icon-cover-card:hover,
|
||||
z-index: 2;
|
||||
}
|
||||
.avatar-img.link-img img.aksrt-lazy { object-fit: cover; }
|
||||
|
||||
|
||||
/* batch49-51 residual */
|
||||
.aksrt-mod-apply-modal[hidden] { display: none !important; }
|
||||
.aksrt-mod-apply-modal {
|
||||
position: fixed; inset: 0; z-index: 10050;
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
}
|
||||
.aksrt-mod-apply-modal__backdrop {
|
||||
position: absolute; inset: 0; background: rgba(15, 23, 42, .45);
|
||||
}
|
||||
.aksrt-mod-apply-modal__dialog {
|
||||
position: relative; z-index: 1; width: min(420px, calc(100vw - 32px));
|
||||
max-height: min(80vh, 560px); overflow: auto;
|
||||
padding: 16px; border-radius: 12px; background: var(--surface-1, #fff);
|
||||
box-shadow: 0 18px 50px rgba(0,0,0,.2);
|
||||
}
|
||||
.aksrt-mod-apply-modal__dialog textarea {
|
||||
width: 100%; min-height: 96px; border: 1px solid var(--color-line, #e5e7eb);
|
||||
border-radius: 8px; padding: 8px 10px; resize: vertical;
|
||||
}
|
||||
.aksrt-mod-apply-modal__dialog .js-aksrt-action-feedback.is-error { color: #ef4444; }
|
||||
.aksrt-mod-apply-modal__dialog .js-aksrt-action-feedback.is-success { color: #10b981; }
|
||||
.aksrt-mod-apply-modal__dialog .js-aksrt-action-feedback.is-loading { color: #64748b; }
|
||||
body.aksrt-mod-apply-open { overflow: hidden; }
|
||||
.aksrt-product-widget__item--list { gap: 12px; padding: 10px 0; border-bottom: 1px solid var(--color-line, rgba(0,0,0,.06)); }
|
||||
.aksrt-product-widget__item--list:last-child { border-bottom: 0; }
|
||||
.aksrt-product-widget__thumb.list {
|
||||
flex: 0 0 80px; width: 80px; height: 80px; border-radius: 10px; overflow: hidden;
|
||||
background: var(--surface-2, #f3f4f6); display: block;
|
||||
}
|
||||
.aksrt-product-widget__thumb.list img { width: 100%; height: 100%; object-fit: cover; display: block; }
|
||||
.text-ellipsis-2 {
|
||||
display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
|
||||
}
|
||||
|
||||
@@ -42,6 +42,9 @@
|
||||
tab_count: tabCount,
|
||||
style: style,
|
||||
paginate: paginate,
|
||||
topics: tab.getAttribute('data-topics') || '',
|
||||
limit_day: tab.getAttribute('data-limit-day') || '0',
|
||||
pay_type: tab.getAttribute('data-pay-type') || '',
|
||||
});
|
||||
var url = rest + (rest.indexOf('?') > -1 ? '&' : '?') + qs.toString();
|
||||
panel.classList.add('is-ajax-loading');
|
||||
@@ -379,6 +382,87 @@
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function initModeratorApplyModal() {
|
||||
document.addEventListener('click', function (e) {
|
||||
var openBtn = e.target.closest('[data-aksrt-mod-apply-open]');
|
||||
if (openBtn) {
|
||||
e.preventDefault();
|
||||
var id = openBtn.getAttribute('data-aksrt-mod-apply-open');
|
||||
var modal = id ? document.getElementById(id) : null;
|
||||
if (modal) {
|
||||
modal.hidden = false;
|
||||
document.body.classList.add('aksrt-mod-apply-open');
|
||||
}
|
||||
return;
|
||||
}
|
||||
var closeBtn = e.target.closest('[data-aksrt-mod-apply-close]');
|
||||
if (closeBtn) {
|
||||
var box = closeBtn.closest('.aksrt-mod-apply-modal');
|
||||
if (box) {
|
||||
box.hidden = true;
|
||||
document.body.classList.remove('aksrt-mod-apply-open');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
document.querySelectorAll('.js-aksrt-moderator-apply-form').forEach(function (form) {
|
||||
if (form.dataset.aksrtModApplyBound === '1') return;
|
||||
form.dataset.aksrtModApplyBound = '1';
|
||||
form.addEventListener('submit', function (event) {
|
||||
event.preventDefault();
|
||||
var boardId = parseInt(form.getAttribute('data-board-id') || '0', 10);
|
||||
var reasonField = form.querySelector('[name="reason"]');
|
||||
var reason = reasonField ? reasonField.value.trim() : '';
|
||||
var feedback = form.querySelector('.js-aksrt-action-feedback');
|
||||
var submitButton = form.querySelector('button[type="submit"]');
|
||||
if (!boardId || !reason) {
|
||||
if (feedback) {
|
||||
feedback.textContent = '请填写完整的申请理由。';
|
||||
feedback.className = 'js-aksrt-action-feedback mb10 is-error';
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (submitButton) submitButton.disabled = true;
|
||||
if (feedback) {
|
||||
feedback.textContent = '正在提交申请…';
|
||||
feedback.className = 'js-aksrt-action-feedback mb10 is-loading';
|
||||
}
|
||||
var siteUrl = (window.aksrtData && aksrtData.siteUrl) ? String(aksrtData.siteUrl).replace(/\/+$/, '') : '';
|
||||
var url = siteUrl + '/wp-json/aksrt/v1/forum/moderator/apply';
|
||||
fetch(url, {
|
||||
method: 'POST',
|
||||
credentials: 'same-origin',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
Accept: 'application/json',
|
||||
'X-WP-Nonce': (window.aksrtData && aksrtData.restNonce) || '',
|
||||
},
|
||||
body: JSON.stringify({ board_id: boardId, reason: reason }),
|
||||
})
|
||||
.then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); })
|
||||
.then(function (res) {
|
||||
if (!res.ok || (res.j && res.j.success === false)) {
|
||||
throw new Error((res.j && res.j.message) || '申请提交失败');
|
||||
}
|
||||
var msg = (res.j && (res.j.message || (res.j.data && res.j.data.message))) || '申请已提交';
|
||||
if (feedback) {
|
||||
feedback.textContent = msg;
|
||||
feedback.className = 'js-aksrt-action-feedback mb10 is-success';
|
||||
}
|
||||
if (reasonField) reasonField.disabled = true;
|
||||
})
|
||||
.catch(function (err) {
|
||||
if (feedback) {
|
||||
feedback.textContent = (err && err.message) || '申请提交失败。';
|
||||
feedback.className = 'js-aksrt-action-feedback mb10 is-error';
|
||||
}
|
||||
if (submitButton) submitButton.disabled = false;
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function initFloatingQRCodes() {
|
||||
var wrap = document.querySelector('.float-right');
|
||||
if (!wrap) return;
|
||||
@@ -424,6 +508,7 @@
|
||||
initProductTabs();
|
||||
initMainPostsLazy();
|
||||
initFeatureIntro();
|
||||
initModeratorApplyModal();
|
||||
initFloatingQRCodes();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user