diff --git a/assets/css/routes/user-center/credits.css b/assets/css/routes/user-center/credits.css index f0e36433..a3b5d7e8 100644 --- a/assets/css/routes/user-center/credits.css +++ b/assets/css/routes/user-center/credits.css @@ -886,10 +886,102 @@ body.uc-modal-open { border: 0; cursor: pointer; } +.uc-withdraw-history-modal__dialog { + max-width: min(860px, calc(100vw - 32px)); + overflow: hidden; +} +.uc-withdraw-history { + width: 100%; +} +.uc-withdraw-history__item { + display: flex; + align-items: center; + gap: 12px; + min-width: 0; + padding: 10px 0; + border-bottom: 1px solid var(--muted-border-color, rgba(0,0,0,.08)); + white-space: nowrap; +} .uc-withdraw-history__item:last-child { - border-bottom: 0 !important; + border-bottom: 0; +} +.uc-withdraw-history__status, +.uc-withdraw-history__amount { + flex: 0 0 auto; +} +.uc-withdraw-history__amount { + min-width: 84px; + text-align: right; + font-weight: 700; +} +.uc-withdraw-history__number, +.uc-withdraw-history__meta, +.uc-withdraw-history__note { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; +} +.uc-withdraw-history__number { + flex: 1 1 190px; +} +.uc-withdraw-history__meta { + flex: 0 1 190px; +} +.uc-withdraw-history__note { + flex: 0 1 160px; +} +.uc-withdraw-history__pagination { + display: flex; + justify-content: center; + align-items: center; + flex-wrap: wrap; + gap: 6px; + margin-top: 14px; +} +.uc-withdraw-history__page { + min-width: 34px; + height: 32px; + padding: 0 8px; + border: 1px solid var(--muted-border-color, rgba(0,0,0,.12)); + border-radius: 6px; + background: transparent; + color: inherit; + cursor: pointer; +} +.uc-withdraw-history__page:hover:not(:disabled), +.uc-withdraw-history__page.is-current { + border-color: var(--focus-color, #3b82f6); + background: var(--focus-color, #3b82f6); + color: #fff; +} +.uc-withdraw-history__page:disabled { + cursor: not-allowed; + opacity: .45; } +@media (max-width: 640px) { + .uc-withdraw-history-modal__dialog { + max-width: calc(100vw - 20px); + padding-left: 12px; + padding-right: 12px; + } + .uc-withdraw-history__item { + gap: 8px; + font-size: 12px; + } + .uc-withdraw-history__amount { + min-width: 66px; + } + .uc-withdraw-history__number { + flex-basis: 120px; + } + .uc-withdraw-history__meta { + flex-basis: 120px; + } + .uc-withdraw-history__note { + display: none; + } +} /* Points tasks tab */ .uc-points-tasks .border-bottom, diff --git a/assets/js/credits.js b/assets/js/credits.js index 7978ccb9..9856c0b6 100644 --- a/assets/js/credits.js +++ b/assets/js/credits.js @@ -804,19 +804,143 @@ } - function initWithdrawHistory() { - var modal = document.querySelector('[data-aksrt-withdraw-history-modal]'); - if (!modal || modal.dataset.aksrtWithdrawHistoryInitialized === '1') return; - modal.dataset.aksrtWithdrawHistoryInitialized = '1'; - function open() { modal.hidden = false; document.body.classList.add('uc-modal-open'); } - function close() { modal.hidden = true; document.body.classList.remove('uc-modal-open'); } - document.querySelectorAll('[data-aksrt-withdraw-history-open]').forEach(function (btn) { - btn.addEventListener('click', function (e) { e.preventDefault(); open(); }); - }); - modal.querySelectorAll('[data-aksrt-withdraw-history-close]').forEach(function (btn) { - btn.addEventListener('click', function (e) { e.preventDefault(); close(); }); - }); - } + function initWithdrawHistory() { + var modal = document.querySelector('[data-aksrt-withdraw-history-modal]'); + if (!modal || modal.dataset.aksrtWithdrawHistoryInitialized === '1') return; + modal.dataset.aksrtWithdrawHistoryInitialized = '1'; + var list = modal.querySelector('[data-aksrt-withdraw-history-list]'); + var pagination = modal.querySelector('[data-aksrt-withdraw-history-pagination]'); + var statusLabels = { + pending: '待处理', + processing: '处理中', + completed: '已完成', + rejected: '已拒绝' + }; + var currentPage = 1; + var loading = false; + + function text(value) { + return value === null || value === undefined ? '' : String(value); + } + + function appendText(parent, value, className) { + var node = document.createElement('span'); + if (className) node.className = className; + node.textContent = text(value); + parent.appendChild(node); + return node; + } + + function renderItems(items) { + if (!list) return; + list.textContent = ''; + if (!Array.isArray(items) || !items.length) { + var empty = document.createElement('div'); + empty.className = 'uc-transactions__empty'; + var emptyText = document.createElement('p'); + emptyText.textContent = '暂无提现记录'; + empty.appendChild(emptyText); + list.appendChild(empty); + return; + } + items.forEach(function (item) { + var status = text(item && item.status).toLowerCase(); + var row = document.createElement('div'); + row.className = 'uc-withdraw-history__item'; + var badge = appendText(row, statusLabels[status] || status, 'badg badg-sm uc-withdraw-history__status'); + badge.classList.add(status === 'rejected' ? 'c-red' : (status === 'completed' ? 'c-green' : 'c-blue')); + appendText(row, item && (item.gross_amount || item.amount), 'uc-withdraw-history__amount em12'); + var number = document.createElement('span'); + number.className = 'uc-withdraw-history__number muted-2-color em09'; + var numberLabel = document.createElement('span'); + numberLabel.textContent = '提现单号:'; + number.appendChild(numberLabel); + var code = document.createElement('code'); + code.textContent = text(item && item.withdrawal_number); + number.appendChild(code); + row.appendChild(number); + var meta = appendText(row, text(item && item.created_at), 'uc-withdraw-history__meta muted-2-color em09'); + var gross = text(item && (item.gross_amount || item.amount)); + var net = text(item && item.amount); + if (gross !== net && net !== '') meta.appendChild(document.createTextNode(' · 到账 ' + net)); + if (item && item.note) appendText(row, item.note, 'uc-withdraw-history__note muted-2-color em09'); + list.appendChild(row); + }); + } + + function renderPagination(page, maxPages) { + if (!pagination) return; + pagination.textContent = ''; + if (maxPages <= 1) return; + function addButton(label, target, disabled, current) { + var button = document.createElement('button'); + button.type = 'button'; + button.className = 'uc-withdraw-history__page' + (current ? ' is-current' : ''); + button.textContent = label; + button.disabled = !!disabled; + if (current) button.setAttribute('aria-current', 'page'); + button.dataset.aksrtWithdrawHistoryPage = String(target); + pagination.appendChild(button); + } + addButton('上一页', page - 1, page <= 1, false); + for (var index = 1; index <= maxPages; index += 1) addButton(String(index), index, false, index === page); + addButton('下一页', page + 1, page >= maxPages, false); + } + + function loadPage(page) { + if (loading || !list) return; + loading = true; + list.textContent = '加载中…'; + var rest = (window.aksrtData && (window.aksrtData.restUrl || window.aksrtData.apiUrl)) || ''; + if (!rest) { + list.textContent = '记录加载失败,请重试'; + loading = false; + return; + } + var url = rest.replace(/\/$/, '') + '/earnings/withdrawals?page=' + encodeURIComponent(Math.max(1, page)) + '&per_page=10'; + fetch(url, { + credentials: 'same-origin', + headers: { 'X-WP-Nonce': (window.aksrtData && (window.aksrtData.restNonce || window.aksrtData.nonce)) || '' } + }).then(function (response) { + return response.json().then(function (payload) { + if (!response.ok || !payload || !Array.isArray(payload.items)) throw new Error('withdraw-history-load-failed'); + currentPage = Math.max(1, parseInt(payload.page, 10) || 1); + var maxPages = Math.max(1, parseInt(payload.max_pages, 10) || 1); + renderItems(payload.items); + renderPagination(currentPage, maxPages); + }); + }).catch(function () { + list.textContent = '记录加载失败,请重试'; + if (pagination) pagination.textContent = ''; + }).finally(function () { + loading = false; + }); + } + + function open() { + modal.hidden = false; + document.body.classList.add('uc-modal-open'); + loadPage(1); + } + function close() { + modal.hidden = true; + document.body.classList.remove('uc-modal-open'); + } + document.querySelectorAll('[data-aksrt-withdraw-history-open]').forEach(function (btn) { + btn.addEventListener('click', function (e) { e.preventDefault(); open(); }); + }); + modal.querySelectorAll('[data-aksrt-withdraw-history-close]').forEach(function (btn) { + btn.addEventListener('click', function (e) { e.preventDefault(); close(); }); + }); + if (pagination) { + pagination.addEventListener('click', function (e) { + var button = e.target.closest('[data-aksrt-withdraw-history-page]'); + if (!button || button.disabled) return; + e.preventDefault(); + loadPage(parseInt(button.dataset.aksrtWithdrawHistoryPage || '1', 10) || 1); + }); + } + } window.AKSRTWithdrawInit = initWithdraw; window.AKSRTAssetBalances = { diff --git a/inc/helpers/user-center-renderers/credits-wallet.php b/inc/helpers/user-center-renderers/credits-wallet.php index 7428536f..fca1dbca 100644 --- a/inc/helpers/user-center-renderers/credits-wallet.php +++ b/inc/helpers/user-center-renderers/credits-wallet.php @@ -40,14 +40,11 @@ $withdraw_settings = class_exists('\\AKSRT\\Settings\\Settings') ? \AKSRT\Settin $withdraw_min = $normalize_balance($withdraw_settings['min_amount'] ?? '50')->decimal(); $withdraw_usage = ['remaining_count' => 0, 'remaining_amount' => '0.00']; $withdraw_pending_hold = '0.00'; -$withdraw_history = []; if ($withdraw_on && class_exists('\AKSRT\Payment\Withdrawal')) { $wd_svc = \AKSRT\Payment\Withdrawal::get_instance(); $withdraw_pending_hold = $wd_svc->sum_pending_hold((int) ($user_id ?? 0)); - $withdraw_history = $wd_svc->get_user_withdrawals((int) ($user_id ?? 0), ['limit' => 30]); $withdraw_usage = $wd_svc->daily_usage((int) ($user_id ?? 0), $withdraw_settings); } -$withdraw_processing = $normalize_balance($withdraw_pending_hold)->minor() > 0; $card_pass_balance = ['enabled' => false, 'desc' => '', 'only_password' => true]; if (class_exists('\AKSRT\Payment\ChargeCard')) { $opts = \AKSRT\Payment\ChargeCard::get_instance()->get_public_options(); @@ -187,50 +184,16 @@ $mark = (string) ($charge_view['currency_mark'] ?? '元'); endif; ?> - __('待处理', 'aksrt'), - 'processing' => __('处理中', 'aksrt'), - 'completed' => __('已完成', 'aksrt'), - 'rejected' => __('已拒绝', 'aksrt'), - ]; - ?> -