162 lines
6.6 KiB
JavaScript
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);
|
|
}
|