Files
2026-07-23 08:58:13 +08:00

162 lines
6.6 KiB
JavaScript

document.querySelectorAll('[data-amount]').forEach(function (button) {
button.addEventListener('click', function () {
var input = button.closest('form').querySelector('input[name="amount"]');
if (input) input.value = button.dataset.amount;
});
});
document.querySelectorAll('.alert').forEach(function (alert) {
window.setTimeout(function () { alert.style.display = 'none'; }, 5000);
});
document.querySelectorAll('.badge.rewarded').forEach(function (badge) {
badge.classList.add('approved');
});
document.querySelectorAll('[data-copy]').forEach(function (button) {
button.addEventListener('click', function () {
var input = document.querySelector(button.dataset.copy);
if (!input) return;
var original = button.textContent;
var copied = function () {
button.textContent = '已复制';
window.setTimeout(function () { button.textContent = original; }, 1500);
};
if (navigator.clipboard && window.isSecureContext) {
navigator.clipboard.writeText(input.value).then(copied);
return;
}
input.select();
document.execCommand('copy');
copied();
});
});
var adminNavigation = document.querySelector('.admin-side nav');
if (adminNavigation && !adminNavigation.querySelector('a[href="/admin/audits.php"]')) {
var settingsLink = adminNavigation.querySelector('a[href*="view=settings"]');
var auditLink = document.createElement('a');
auditLink.href = '/admin/audits.php';
auditLink.textContent = '操作审计';
adminNavigation.insertBefore(auditLink, settingsLink || null);
}
var cardManager = document.querySelector('[data-card-manager]');
if (cardManager) {
var cardStyles = document.createElement('link');
cardStyles.rel = 'stylesheet';
cardStyles.href = '/assets/cards-admin.css?v=20260722-2';
document.head.appendChild(cardStyles);
var cardInputs = Array.prototype.slice.call(cardManager.querySelectorAll('.card-select:not(:disabled)'));
var cardToggleAll = cardManager.querySelector('[data-card-toggle-all]');
var cardSelectAll = cardManager.querySelector('[data-card-select-all]');
var cardCopy = cardManager.querySelector('[data-card-copy]');
var cardExport = cardManager.querySelector('[data-card-export]');
var cardCount = cardManager.querySelector('[data-card-selected-count]');
function selectedCards() {
return cardInputs.filter(function (input) { return input.checked; });
}
function updateCardSelection() {
var selected = selectedCards();
cardCount.textContent = '已选 ' + selected.length + ' 张';
cardCopy.disabled = selected.length === 0;
cardExport.disabled = selected.length === 0;
cardSelectAll.disabled = cardInputs.length === 0;
cardSelectAll.textContent = selected.length === cardInputs.length && cardInputs.length ? '取消全选' : '全选可用卡';
cardToggleAll.disabled = cardInputs.length === 0;
cardToggleAll.checked = selected.length === cardInputs.length && cardInputs.length > 0;
cardToggleAll.indeterminate = selected.length > 0 && selected.length < cardInputs.length;
}
function setCardButtonFeedback(button, message) {
var original = button.textContent;
button.textContent = message;
window.setTimeout(function () { button.textContent = original; }, 1500);
}
function fallbackCopy(text) {
var textarea = document.createElement('textarea');
textarea.value = text;
textarea.setAttribute('readonly', '');
textarea.style.position = 'fixed';
textarea.style.left = '-9999px';
document.body.appendChild(textarea);
textarea.select();
document.execCommand('copy');
document.body.removeChild(textarea);
}
cardInputs.forEach(function (input) { input.addEventListener('change', updateCardSelection); });
cardSelectAll.addEventListener('click', function () {
var shouldSelect = selectedCards().length !== cardInputs.length;
cardInputs.forEach(function (input) { input.checked = shouldSelect; });
updateCardSelection();
});
cardToggleAll.addEventListener('change', function () {
cardInputs.forEach(function (input) { input.checked = cardToggleAll.checked; });
updateCardSelection();
});
cardCopy.addEventListener('click', function () {
var text = selectedCards().map(function (input) { return input.dataset.cardCode; }).join('\n');
if (!text) return;
if (navigator.clipboard && window.isSecureContext) {
navigator.clipboard.writeText(text).then(function () { setCardButtonFeedback(cardCopy, '已复制'); }, function () {
fallbackCopy(text);
setCardButtonFeedback(cardCopy, '已复制');
});
} else {
fallbackCopy(text);
setCardButtonFeedback(cardCopy, '已复制');
}
});
cardExport.addEventListener('click', function () {
var rows = [['卡号', '类型', '面额', '状态', '生成时间']];
selectedCards().forEach(function (input) {
rows.push([input.dataset.cardCode, input.dataset.cardType, input.dataset.cardAmount, input.dataset.cardStatus, input.dataset.cardCreated]);
});
if (rows.length === 1) return;
var csv = rows.map(function (row) {
return row.map(function (value) { return '"' + String(value).replace(/"/g, '""') + '"'; }).join(',');
}).join('\r\n');
var url = URL.createObjectURL(new Blob(['\ufeff' + csv], {type: 'text/csv;charset=utf-8'}));
var download = document.createElement('a');
var stamp = new Date().toISOString().replace(/[-:T]/g, '').slice(0, 14);
download.href = url;
download.download = 'recharge-cards-' + stamp + '.csv';
document.body.appendChild(download);
download.click();
document.body.removeChild(download);
URL.revokeObjectURL(url);
setCardButtonFeedback(cardExport, '已导出');
});
updateCardSelection();
}
var cardCreateForm = document.querySelector('[data-card-create-form]');
if (cardCreateForm) {
var cardTypeInput = cardCreateForm.querySelector('[data-card-type]');
var cardCountInput = cardCreateForm.querySelector('[data-card-count]');
function updateCardCountInput() {
if (cardTypeInput.value === 'shared') {
cardCountInput.dataset.singleCount = cardCountInput.value;
cardCountInput.value = '1';
cardCountInput.readOnly = true;
} else {
cardCountInput.readOnly = false;
if (cardCountInput.value === '1' && cardCountInput.dataset.singleCount) cardCountInput.value = cardCountInput.dataset.singleCount;
}
}
cardTypeInput.addEventListener('change', updateCardCountInput);
updateCardCountInput();
}
if (document.querySelector('.game-config')) {
var gameAdminStyles = document.createElement('link');
gameAdminStyles.rel = 'stylesheet';
gameAdminStyles.href = '/assets/game-admin.css?v=20260721';
document.head.appendChild(gameAdminStyles);
}