进行了一些小优化

This commit is contained in:
2026-08-25 16:33:36 +08:00
parent e5df6fdaa7
commit 4a4009133c
5 changed files with 130 additions and 63 deletions
+5 -3
View File
@@ -58,10 +58,10 @@
.aksrt-orders-page__filter-group { display: flex; flex: 1 1 100%; gap: 10px; align-items: center; } .aksrt-orders-page__filter-group { display: flex; flex: 1 1 100%; gap: 10px; align-items: center; }
.aksrt-orders-page__filter-label { flex: 0 0 58px; color: var(--orders-muted); font-size: 12px; font-weight: 650; } .aksrt-orders-page__filter-label { flex: 0 0 58px; color: var(--orders-muted); font-size: 12px; font-weight: 650; }
.aksrt-orders-page__status-filters, .aksrt-orders-page__type-filters { display: flex; flex-wrap: wrap; gap: 6px; } .aksrt-orders-page__status-filters, .aksrt-orders-page__type-filters { display: flex; flex-wrap: wrap; gap: 6px; }
.aksrt-orders-page__filter-chip { display: inline-flex; gap: 5px; align-items: center; padding: 5px 9px; border: 1px solid var(--orders-line); border-radius: 999px; background: var(--surface-1, #fff); color: var(--orders-muted); font-size: 12px; text-decoration: none; } .aksrt-orders-page__filter-chip { display: inline-flex; gap: 5px; align-items: center; padding: 5px 9px; border: 1px solid var(--orders-line); border-radius: 999px; background: var(--surface-1, #fff); color: var(--orders-muted); font: inherit; font-size: 12px; text-decoration: none; cursor: pointer; }
.aksrt-orders-page__filter-chip.is-active { border-color: var(--color-primary, #3b82f6); background: color-mix(in srgb, var(--color-primary, #3b82f6) 10%, var(--surface-1, #fff)); color: var(--color-primary, #3b82f6); font-weight: 700; } .aksrt-orders-page__filter-chip.is-active { border-color: var(--color-primary, #3b82f6); background: color-mix(in srgb, var(--color-primary, #3b82f6) 10%, var(--surface-1, #fff)); color: var(--color-primary, #3b82f6); font-weight: 700; }
.aksrt-orders-page__filter-count { display: inline-grid; min-width: 17px; height: 17px; padding: 0 4px; place-items: center; border-radius: 999px; background: var(--color-warning, #c87819); color: #fff; font-size: 10px; line-height: 1; } .aksrt-orders-page__filter-count { display: inline-grid; min-width: 17px; height: 17px; padding: 0 4px; place-items: center; border-radius: 999px; background: var(--color-warning, #c87819); color: #fff; font-size: 10px; line-height: 1; }
.aksrt-orders-page__clear { margin-left: auto; color: var(--color-primary, #3b82f6); font-size: 12px; text-decoration: none; } .aksrt-orders-page__clear { margin-left: auto; padding: 0; border: 0; background: transparent; color: var(--color-primary, #3b82f6); font: inherit; font-size: 12px; text-decoration: none; cursor: pointer; }
.aksrt-orders-page__list { display: grid; gap: 10px; } .aksrt-orders-page__list { display: grid; gap: 10px; }
.aksrt-orders-page__card { overflow: hidden; border: 1px solid var(--orders-line); border-radius: 13px; background: var(--surface-1, #fff); transition: border-color .18s ease, transform .18s ease, box-shadow .18s ease; } .aksrt-orders-page__card { overflow: hidden; border: 1px solid var(--orders-line); border-radius: 13px; background: var(--surface-1, #fff); transition: border-color .18s ease, transform .18s ease, box-shadow .18s ease; }
@@ -84,8 +84,10 @@
.aksrt-orders-page__countdown { margin-right: auto; color: var(--color-warning, #c87819); font-size: 11px; font-variant-numeric: tabular-nums; } .aksrt-orders-page__countdown { margin-right: auto; color: var(--color-warning, #c87819); font-size: 11px; font-variant-numeric: tabular-nums; }
.aksrt-orders-page__pagination { display: flex; justify-content: center; gap: 6px; margin-top: 20px; } .aksrt-orders-page__pagination { display: flex; justify-content: center; gap: 6px; margin-top: 20px; }
.aksrt-orders-page__page-chip { display: grid; width: 31px; height: 31px; place-items: center; border: 1px solid var(--orders-line); border-radius: 8px; color: var(--orders-muted); font-size: 12px; text-decoration: none; } .aksrt-orders-page__page-chip { display: grid; width: 31px; height: 31px; padding: 0; place-items: center; border: 1px solid var(--orders-line); border-radius: 8px; background: var(--surface-1, #fff); color: var(--orders-muted); font: inherit; font-size: 12px; text-decoration: none; cursor: pointer; }
.aksrt-orders-page__page-chip.is-active { border-color: var(--color-primary, #3b82f6); background: var(--color-primary, #3b82f6); color: #fff; } .aksrt-orders-page__page-chip.is-active { border-color: var(--color-primary, #3b82f6); background: var(--color-primary, #3b82f6); color: #fff; }
.aksrt-orders-page [data-aksrt-order-list], .aksrt-orders-page__stats, .aksrt-orders-page__pagination { transition: opacity .16s ease; }
.aksrt-orders-page.is-loading [data-aksrt-order-list], .aksrt-orders-page.is-loading .aksrt-orders-page__stats, .aksrt-orders-page.is-loading .aksrt-orders-page__pagination { opacity: .55; pointer-events: none; }
.aksrt-orders-page__empty { padding: 52px 20px; border: 1px dashed var(--orders-line); border-radius: 13px; background: var(--surface-2, #f7f8fb); text-align: center; } .aksrt-orders-page__empty { padding: 52px 20px; border: 1px dashed var(--orders-line); border-radius: 13px; background: var(--surface-2, #f7f8fb); text-align: center; }
.aksrt-orders-page__empty i { display: block; margin-bottom: 12px; color: var(--color-primary, #3b82f6); font-size: 30px; } .aksrt-orders-page__empty i { display: block; margin-bottom: 12px; color: var(--color-primary, #3b82f6); font-size: 30px; }
.aksrt-orders-page__empty h3 { margin: 0 0 7px; font-size: 15px; }.aksrt-orders-page__empty p { margin: 0 0 16px; color: var(--orders-muted); font-size: 13px; } .aksrt-orders-page__empty h3 { margin: 0 0 7px; font-size: 15px; }.aksrt-orders-page__empty p { margin: 0 0 16px; color: var(--orders-muted); font-size: 13px; }
+90 -17
View File
@@ -160,11 +160,12 @@
}); });
} }
function currentViewPath() { function currentViewPath(state) {
var params = new URLSearchParams(window.location.search);
var allowed = ["order_status", "order_type", "order_number", "order_page"];
var query = new URLSearchParams(); var query = new URLSearchParams();
allowed.forEach(function (key) { if (params.get(key)) query.set(key, params.get(key)); }); if (state.query.status && state.query.status !== "all") query.set("order_status", state.query.status);
if (state.query.type) query.set("order_type", state.query.type);
if (state.query.orderNumber) query.set("order_number", state.query.orderNumber);
if (Number(state.query.page) > 1) query.set("order_page", String(state.query.page));
return "/orders/view" + (query.toString() ? "?" + query.toString() : ""); return "/orders/view" + (query.toString() ? "?" + query.toString() : "");
} }
@@ -195,6 +196,11 @@
root.innerHTML = '<div class="aksrt-orders-page__stat"><span>全部</span><strong>' + Number(stats.total || 0) + "</strong></div>" + root.innerHTML = '<div class="aksrt-orders-page__stat"><span>全部</span><strong>' + Number(stats.total || 0) + "</strong></div>" +
'<div class="aksrt-orders-page__stat"><span>待支付</span><strong class="is-pending">' + Number(stats.pending || 0) + "</strong></div>" + '<div class="aksrt-orders-page__stat"><span>待支付</span><strong class="is-pending">' + Number(stats.pending || 0) + "</strong></div>" +
'<div class="aksrt-orders-page__stat"><span>已支付</span><strong class="is-paid">' + Number(stats.paid || 0) + "</strong></div>"; '<div class="aksrt-orders-page__stat"><span>已支付</span><strong class="is-paid">' + Number(stats.paid || 0) + "</strong></div>";
var pendingCount = state.root.querySelector('[data-aksrt-order-filter="status"][data-aksrt-order-filter-value="pending"] .aksrt-orders-page__filter-count');
if (pendingCount) {
pendingCount.textContent = String(Number(stats.pending || 0));
pendingCount.hidden = Number(stats.pending || 0) < 1;
}
} }
function renderPagination(state, view) { function renderPagination(state, view) {
@@ -204,14 +210,14 @@
var root = document.createElement("nav"); var root = document.createElement("nav");
root.className = "aksrt-orders-page__pagination"; root.className = "aksrt-orders-page__pagination";
root.setAttribute("aria-label", "订单分页"); root.setAttribute("aria-label", "订单分页");
var base = new URL(window.location.href);
for (var i = 1; i <= Number(view.total_pages); i++) { for (var i = 1; i <= Number(view.total_pages); i++) {
base.searchParams.set("order_page", String(i)); var button = document.createElement("button");
var link = document.createElement("a"); button.type = "button";
link.className = "aksrt-orders-page__page-chip" + (i === Number(view.page) ? " is-active" : ""); button.className = "aksrt-orders-page__page-chip" + (i === Number(view.page) ? " is-active" : "");
link.href = base.toString(); button.setAttribute("data-aksrt-order-page", String(i));
link.textContent = String(i); if (i === Number(view.page)) button.setAttribute("aria-current", "page");
root.appendChild(link); button.textContent = String(i);
root.appendChild(button);
} }
var list = state.root.querySelector("[data-aksrt-order-list]"); var list = state.root.querySelector("[data-aksrt-order-list]");
if (list) list.after(root); if (list) list.after(root);
@@ -226,32 +232,67 @@
} }
function renderView(state, view) { function renderView(state, view) {
var viewQuery = view.query || {};
state.query.status = String(viewQuery.order_status || "all");
state.query.type = String(viewQuery.order_type || "");
state.query.orderNumber = String(viewQuery.order_number || "");
state.query.page = Math.max(1, Number(view.page || viewQuery.order_page || 1));
renderStats(state, view.stats || {}); renderStats(state, view.stats || {});
var list = state.root.querySelector("[data-aksrt-order-list]"); var list = state.root.querySelector("[data-aksrt-order-list]");
if (!list) return; if (!list) return;
var items = Array.isArray(view.items) ? view.items : []; var items = Array.isArray(view.items) ? view.items : [];
if (!items.length) { if (!items.length) {
list.innerHTML = '<div class="aksrt-orders-page__empty"><i class="fa fas fa-file-alt" aria-hidden="true"></i><h3>没有匹配的订单</h3><p>换个条件试试,或清除当前筛选。</p></div>'; list.innerHTML = '<i class="fa fas fa-file-alt" aria-hidden="true"></i><h3>没有匹配的订单</h3><p>换个条件试试,或清除当前筛选。</p>';
list.classList.add("is-empty"); list.classList.remove("aksrt-orders-page__list");
list.classList.add("aksrt-orders-page__empty");
} else { } else {
list.classList.remove("is-empty"); list.classList.remove("aksrt-orders-page__empty");
list.classList.add("aksrt-orders-page__list");
list.innerHTML = items.map(cardHtml).join(""); list.innerHTML = items.map(cardHtml).join("");
} }
renderPagination(state, view); renderPagination(state, view);
syncControls(state);
updateCountdowns(state); updateCountdowns(state);
} }
function refreshView(state) { function syncControls(state) {
return request(currentViewPath(), undefined, "GET").then(function (result) { state.root.querySelectorAll("[data-aksrt-order-filter]").forEach(function (button) {
var field = button.getAttribute("data-aksrt-order-filter");
var expected = field === "status" ? state.query.status : state.query.type;
var active = button.getAttribute("data-aksrt-order-filter-value") === expected;
button.classList.toggle("is-active", active);
button.setAttribute("aria-pressed", active ? "true" : "false");
});
var input = state.root.querySelector("#aksrt-order-number");
if (input && input.value !== state.query.orderNumber) input.value = state.query.orderNumber;
}
function setViewLoading(state, loading) {
state.root.classList.toggle("is-loading", loading);
state.root.setAttribute("aria-busy", loading ? "true" : "false");
}
function loadView(state, patch) {
Object.keys(patch || {}).forEach(function (key) { state.query[key] = patch[key]; });
var requestId = ++state.viewRequest;
setViewLoading(state, true);
return request(currentViewPath(state), undefined, "GET").then(function (result) {
if (requestId !== state.viewRequest) return null;
if (!result || !result.data) throw new Error("刷新失败"); if (!result || !result.data) throw new Error("刷新失败");
renderView(state, result.data); renderView(state, result.data);
return result.data; return result.data;
}).catch(function (error) { }).catch(function (error) {
notyf(errorMessage(error, "订单状态已变更,请刷新后查看"), "danger"); if (requestId === state.viewRequest) notyf(errorMessage(error, "订单加载失败,请稍后重试"), "danger");
return null; return null;
}).finally(function () {
if (requestId === state.viewRequest) setViewLoading(state, false);
}); });
} }
function refreshView(state) {
return loadView(state);
}
function startPayment(state, button) { function startPayment(state, button) {
var number = button.getAttribute("data-aksrt-order-pay") || ""; var number = button.getAttribute("data-aksrt-order-pay") || "";
var method = button.getAttribute("data-aksrt-order-method") || ""; var method = button.getAttribute("data-aksrt-order-method") || "";
@@ -316,6 +357,8 @@
detailReplacementSession: null, detailReplacementSession: null,
countdownTimer: null, countdownTimer: null,
operationKeys: {}, operationKeys: {},
query: { status: "all", type: "", orderNumber: "", page: 1 },
viewRequest: 0,
}; };
state.onRootClick = function (event) { state.onRootClick = function (event) {
@@ -327,6 +370,27 @@
if (panel) panel.hidden = expanded; if (panel) panel.hidden = expanded;
return; return;
} }
var filter = closest(event.target, "[data-aksrt-order-filter]");
if (filter && root.contains(filter)) {
event.preventDefault();
var field = filter.getAttribute("data-aksrt-order-filter");
var patch = { page: 1 };
patch[field] = filter.getAttribute("data-aksrt-order-filter-value") || "";
loadView(state, patch);
return;
}
var page = closest(event.target, "[data-aksrt-order-page]");
if (page && root.contains(page)) {
event.preventDefault();
loadView(state, { page: Math.max(1, Number(page.getAttribute("data-aksrt-order-page") || 1)) });
return;
}
var clear = closest(event.target, "[data-aksrt-orders-clear]");
if (clear && root.contains(clear)) {
event.preventDefault();
loadView(state, { status: "all", type: "", orderNumber: "", page: 1 });
return;
}
var detail = closest(event.target, "[data-aksrt-order-detail]"); var detail = closest(event.target, "[data-aksrt-order-detail]");
if (detail && root.contains(detail)) { openDetail(state, detail.getAttribute("data-aksrt-order-detail")); return; } if (detail && root.contains(detail)) { openDetail(state, detail.getAttribute("data-aksrt-order-detail")); return; }
var pay = closest(event.target, "[data-aksrt-order-pay]"); var pay = closest(event.target, "[data-aksrt-order-pay]");
@@ -334,6 +398,13 @@
var cancel = closest(event.target, "[data-aksrt-order-cancel]"); var cancel = closest(event.target, "[data-aksrt-order-cancel]");
if (cancel && root.contains(cancel)) { event.preventDefault(); closeOrder(state, cancel); } if (cancel && root.contains(cancel)) { event.preventDefault(); closeOrder(state, cancel); }
}; };
state.onRootSubmit = function (event) {
var form = closest(event.target, "[data-aksrt-orders-search]");
if (!form || !root.contains(form)) return;
event.preventDefault();
var input = form.querySelector("#aksrt-order-number");
loadView(state, { orderNumber: input ? String(input.value || "").trim() : "", page: 1 });
};
state.onModalClose = function (event) { state.onModalClose = function (event) {
var detail = event && event.detail ? event.detail : {}; var detail = event && event.detail ? event.detail : {};
if (!state.detailSession || detail.session !== state.detailSession) return; if (!state.detailSession || detail.session !== state.detailSession) return;
@@ -365,6 +436,7 @@
}; };
root.addEventListener("click", state.onRootClick); root.addEventListener("click", state.onRootClick);
root.addEventListener("submit", state.onRootSubmit);
document.addEventListener("aksrt:modal:close", state.onModalClose); document.addEventListener("aksrt:modal:close", state.onModalClose);
document.addEventListener("click", state.onDocumentClick); document.addEventListener("click", state.onDocumentClick);
state.countdownTimer = window.setInterval(function () { updateCountdowns(state); }, 1000); state.countdownTimer = window.setInterval(function () { updateCountdowns(state); }, 1000);
@@ -389,6 +461,7 @@
if (!state) return; if (!state) return;
if (activeDetail(state, state.detailOrderNumber)) window.AksrtModalRuntime.close("replace"); if (activeDetail(state, state.detailOrderNumber)) window.AksrtModalRuntime.close("replace");
item.removeEventListener("click", state.onRootClick); item.removeEventListener("click", state.onRootClick);
item.removeEventListener("submit", state.onRootSubmit);
document.removeEventListener("aksrt:modal:close", state.onModalClose); document.removeEventListener("aksrt:modal:close", state.onModalClose);
document.removeEventListener("click", state.onDocumentClick); document.removeEventListener("click", state.onDocumentClick);
window.clearInterval(state.countdownTimer); window.clearInterval(state.countdownTimer);
+12 -7
View File
@@ -82,12 +82,13 @@
} }
target.classList.add('is-loading'); target.classList.add('is-loading');
var url = restUrl.replace(/\/$/, '') + '/user-center/panel/' + encodeURIComponent(name); var url = restUrl.replace(/\/$/, '') + '/user-center/panel/' + encodeURIComponent(name);
if (name === 'creator' || name === 'revenue' || name === 'posts' || name === 'follow' || name === 'orders') { if (name === 'creator' || name === 'revenue' || name === 'posts' || name === 'follow') {
var params = queryParams || new URLSearchParams(window.location.search); var params = queryParams || new URLSearchParams(window.location.search);
var allowedParams = name === 'creator' ? ['income_page'] : var allowedParams = [];
(name === 'revenue' ? ['reward_tab', 'commission_page', 'user_page'] : if (name === 'creator') allowedParams = ['income_page'];
(name === 'posts' ? ['post_status', 'posts_page'] : if (name === 'revenue') allowedParams = ['reward_tab', 'commission_page', 'user_page'];
(name === 'follow' ? ['follow_list', 'follow_page'] : ['order_status', 'order_type', 'order_number', 'order_page']))); if (name === 'posts') allowedParams = ['post_status', 'posts_page'];
if (name === 'follow') allowedParams = ['follow_list', 'follow_page'];
allowedParams.forEach(function(key) { allowedParams.forEach(function(key) {
if (params.get(key)) url += (url.indexOf('?') === -1 ? '?' : '&') + key + '=' + encodeURIComponent(params.get(key)); if (params.get(key)) url += (url.indexOf('?') === -1 ? '?' : '&') + key + '=' + encodeURIComponent(params.get(key));
}); });
@@ -174,7 +175,7 @@
if (!window.history.replaceState) return; if (!window.history.replaceState) return;
var pathTab = name === 'credits' ? 'balance' : name; var pathTab = name === 'credits' ? 'balance' : name;
var u = new URL('/user/' + pathTab + '/', window.location.origin); var u = new URL('/user/' + pathTab + '/', window.location.origin);
if (sourceUrl && name !== 'revenue') { if (sourceUrl && name !== 'revenue' && name !== 'orders') {
var source = new URL(sourceUrl, window.location.href); var source = new URL(sourceUrl, window.location.href);
source.searchParams.forEach(function(value, key) { u.searchParams.set(key, value); }); source.searchParams.forEach(function(value, key) { u.searchParams.set(key, value); });
} }
@@ -256,7 +257,11 @@
}); });
if (drawerTrigger) drawerTrigger.addEventListener('click', openDrawer); if (drawerTrigger) drawerTrigger.addEventListener('click', openDrawer);
if (drawerOverlay) drawerOverlay.addEventListener('click', closeDrawer); if (drawerOverlay) drawerOverlay.addEventListener('click', closeDrawer);
activate(tabFromUrl(), false); var initialTab = tabFromUrl();
if (initialTab === 'orders' && window.location.search && window.history.replaceState) {
window.history.replaceState({}, '', window.location.pathname + window.location.hash);
}
activate(initialTab, false);
} }
/* ==================== 个人信息保存 ==================== */ /* ==================== 个人信息保存 ==================== */
@@ -15,10 +15,10 @@ if ($user_id <= 0) {
} }
$raw_query = [ $raw_query = [
'status' => $_GET['order_status'] ?? 'all', 'status' => 'all',
'type' => $_GET['order_type'] ?? '', 'type' => '',
'order_number' => $_GET['order_number'] ?? '', 'order_number' => '',
'page' => $_GET['order_page'] ?? 1, 'page' => 1,
'per_page' => 20, 'per_page' => 20,
]; ];
$query = \AKSRT\Payment\OrderCenterQuery::from_array($raw_query); $query = \AKSRT\Payment\OrderCenterQuery::from_array($raw_query);
@@ -35,23 +35,6 @@ $status = $query->status();
$type = $query->product_type(); $type = $query->product_type();
$order_number = $query->order_number(); $order_number = $query->order_number();
$orders_url = static function (array $override = []) use ($status, $type, $order_number, $page): string {
$values = array_merge([
'order_status' => $status,
'order_type' => $type,
'order_number' => $order_number,
'order_page' => $page,
], $override);
$base = function_exists('aksrt_get_user_center_url') ? aksrt_get_user_center_url('orders') : home_url('/profile/');
$values['tab'] = 'orders';
foreach ($values as $key => $value) {
if ($value === '' || $value === null || ($key === 'order_page' && (int) $value <= 1) || ($key === 'order_status' && $value === 'all')) {
unset($values[$key]);
}
}
return add_query_arg($values, remove_query_arg(['order_tab', 'otab', 'section'], $base));
};
$status_options = [ $status_options = [
'all' => __('全部', 'aksrt'), 'all' => __('全部', 'aksrt'),
'pending' => __('待支付', 'aksrt'), 'pending' => __('待支付', 'aksrt'),
@@ -78,13 +61,10 @@ $status_options = [
</div> </div>
</header> </header>
<form class="aksrt-orders-page__search" method="get" action="<?php echo esc_url($orders_url(['order_page' => null])); ?>"> <form class="aksrt-orders-page__search" data-aksrt-orders-search>
<input type="hidden" name="tab" value="orders">
<?php if ($status !== 'all') : ?><input type="hidden" name="order_status" value="<?php echo esc_attr($status); ?>"><?php endif; ?>
<?php if ($type !== '') : ?><input type="hidden" name="order_type" value="<?php echo esc_attr($type); ?>"><?php endif; ?>
<label class="screen-reader-text" for="aksrt-order-number"><?php esc_html_e('按订单号查找', 'aksrt'); ?></label> <label class="screen-reader-text" for="aksrt-order-number"><?php esc_html_e('按订单号查找', 'aksrt'); ?></label>
<i class="fa fas fa-search" aria-hidden="true"></i> <i class="fa fas fa-search" aria-hidden="true"></i>
<input id="aksrt-order-number" name="order_number" value="<?php echo esc_attr($order_number); ?>" maxlength="32" placeholder="<?php esc_attr_e('输入订单号开头快速查找', 'aksrt'); ?>"> <input id="aksrt-order-number" value="<?php echo esc_attr($order_number); ?>" maxlength="32" placeholder="<?php esc_attr_e('输入订单号开头快速查找', 'aksrt'); ?>">
<button class="btn-primary" type="submit"><?php esc_html_e('查找', 'aksrt'); ?></button> <button class="btn-primary" type="submit"><?php esc_html_e('查找', 'aksrt'); ?></button>
<button class="aksrt-orders-page__filter-toggle" type="button" data-aksrt-orders-filter-toggle aria-expanded="false" aria-controls="aksrt-orders-filter-panel"><i class="fa fas fa-sliders-h" aria-hidden="true"></i> <?php esc_html_e('筛选', 'aksrt'); ?></button> <button class="aksrt-orders-page__filter-toggle" type="button" data-aksrt-orders-filter-toggle aria-expanded="false" aria-controls="aksrt-orders-filter-panel"><i class="fa fas fa-sliders-h" aria-hidden="true"></i> <?php esc_html_e('筛选', 'aksrt'); ?></button>
</form> </form>
@@ -94,10 +74,10 @@ $status_options = [
<span class="aksrt-orders-page__filter-label"><?php esc_html_e('订单状态', 'aksrt'); ?></span> <span class="aksrt-orders-page__filter-label"><?php esc_html_e('订单状态', 'aksrt'); ?></span>
<nav class="aksrt-orders-page__status-filters" aria-label="<?php esc_attr_e('订单状态', 'aksrt'); ?>"> <nav class="aksrt-orders-page__status-filters" aria-label="<?php esc_attr_e('订单状态', 'aksrt'); ?>">
<?php foreach ($status_options as $key => $label) : ?> <?php foreach ($status_options as $key => $label) : ?>
<a class="aksrt-orders-page__filter-chip<?php echo $status === $key ? ' is-active' : ''; ?>" href="<?php echo esc_url($orders_url(['order_status' => $key, 'order_page' => null])); ?>"> <button class="aksrt-orders-page__filter-chip<?php echo $status === $key ? ' is-active' : ''; ?>" type="button" data-aksrt-order-filter="status" data-aksrt-order-filter-value="<?php echo esc_attr($key); ?>" aria-pressed="<?php echo $status === $key ? 'true' : 'false'; ?>">
<?php echo esc_html($label); ?> <?php echo esc_html($label); ?>
<?php if ($key === 'pending' && !empty($stats['pending'])) : ?><span class="aksrt-orders-page__filter-count"><?php echo esc_html((string) $stats['pending']); ?></span><?php endif; ?> <?php if ($key === 'pending') : ?><span class="aksrt-orders-page__filter-count"<?php echo empty($stats['pending']) ? ' hidden' : ''; ?>><?php echo esc_html((string) (int) ($stats['pending'] ?? 0)); ?></span><?php endif; ?>
</a> </button>
<?php endforeach; ?> <?php endforeach; ?>
</nav> </nav>
</div> </div>
@@ -105,11 +85,11 @@ $status_options = [
<span class="aksrt-orders-page__filter-label"><?php esc_html_e('订单类型', 'aksrt'); ?></span> <span class="aksrt-orders-page__filter-label"><?php esc_html_e('订单类型', 'aksrt'); ?></span>
<div class="aksrt-orders-page__type-filters"> <div class="aksrt-orders-page__type-filters">
<?php foreach ($type_options as $key => $label) : ?> <?php foreach ($type_options as $key => $label) : ?>
<a class="aksrt-orders-page__filter-chip<?php echo (string) $key === $type ? ' is-active' : ''; ?>" href="<?php echo esc_url($orders_url(['order_type' => $key, 'order_page' => null])); ?>"><?php echo esc_html((string) $label); ?></a> <button class="aksrt-orders-page__filter-chip<?php echo (string) $key === $type ? ' is-active' : ''; ?>" type="button" data-aksrt-order-filter="type" data-aksrt-order-filter-value="<?php echo esc_attr((string) $key); ?>" aria-pressed="<?php echo (string) $key === $type ? 'true' : 'false'; ?>"><?php echo esc_html((string) $label); ?></button>
<?php endforeach; ?> <?php endforeach; ?>
</div> </div>
</div> </div>
<a class="aksrt-orders-page__clear" href="<?php echo esc_url($orders_url(['order_status' => null, 'order_type' => null, 'order_number' => null, 'order_page' => null])); ?>"><?php esc_html_e('清除条件', 'aksrt'); ?></a> <button class="aksrt-orders-page__clear" type="button" data-aksrt-orders-clear><?php esc_html_e('清除条件', 'aksrt'); ?></button>
</div> </div>
<?php if ($orders !== []) : ?> <?php if ($orders !== []) : ?>
@@ -144,9 +124,9 @@ $status_options = [
</article> </article>
<?php endforeach; ?> <?php endforeach; ?>
</div> </div>
<?php if ($total_pages > 1) : ?><nav class="aksrt-orders-page__pagination" aria-label="<?php esc_attr_e('订单分页', 'aksrt'); ?>"><?php for ($index = 1; $index <= $total_pages; $index++) : ?><a class="aksrt-orders-page__page-chip<?php echo $index === $page ? ' is-active' : ''; ?>" href="<?php echo esc_url($orders_url(['order_page' => $index])); ?>"><?php echo esc_html((string) $index); ?></a><?php endfor; ?></nav><?php endif; ?> <?php if ($total_pages > 1) : ?><nav class="aksrt-orders-page__pagination" aria-label="<?php esc_attr_e('订单分页', 'aksrt'); ?>"><?php for ($index = 1; $index <= $total_pages; $index++) : ?><button class="aksrt-orders-page__page-chip<?php echo $index === $page ? ' is-active' : ''; ?>" type="button" data-aksrt-order-page="<?php echo esc_attr((string) $index); ?>"<?php echo $index === $page ? ' aria-current="page"' : ''; ?>><?php echo esc_html((string) $index); ?></button><?php endfor; ?></nav><?php endif; ?>
<?php else : ?> <?php else : ?>
<div class="aksrt-orders-page__empty"><i class="fa fas fa-file-alt" aria-hidden="true"></i><h3><?php echo esc_html($order_number !== '' || $type !== '' || $status !== 'all' ? __('没有匹配的订单', 'aksrt') : __('还没有购买记录', 'aksrt')); ?></h3><p><?php echo esc_html($order_number !== '' || $type !== '' || $status !== 'all' ? __('换个条件试试,或清除当前筛选。', 'aksrt') : __('购买内容或开通权益后,订单会出现在这里。', 'aksrt')); ?></p><?php if ($order_number !== '' || $type !== '' || $status !== 'all') : ?><a class="btn-outline" href="<?php echo esc_url($orders_url(['order_status' => null, 'order_type' => null, 'order_number' => null, 'order_page' => null])); ?>"><?php esc_html_e('清除条件', 'aksrt'); ?></a><?php endif; ?></div> <div class="aksrt-orders-page__empty" data-aksrt-order-list><i class="fa fas fa-file-alt" aria-hidden="true"></i><h3><?php esc_html_e('还没有购买记录', 'aksrt'); ?></h3><p><?php esc_html_e('购买内容或开通权益后,订单会出现在这里。', 'aksrt'); ?></p></div>
<?php endif; ?> <?php endif; ?>
</div> </div>
@@ -367,8 +367,11 @@ test('profile routes load versioned leaf styles and keep dialogs hidden initiall
assert.match(userCenterCreditsCss, /\.uc-asset-tabs,\s*\.uc-asset-tabs\.aksrt-panel\s*\{[^}]*background:\s*var\(--surface-1,\s*#fff\);[^}]*border:[^;}]+;[^}]*box-shadow:[^;}]+;/); assert.match(userCenterCreditsCss, /\.uc-asset-tabs,\s*\.uc-asset-tabs\.aksrt-panel\s*\{[^}]*background:\s*var\(--surface-1,\s*#fff\);[^}]*border:[^;}]+;[^}]*box-shadow:[^;}]+;/);
assert.doesNotMatch(profileCredits, /credits-signin\.php|data-aksrt-signin-calendar/); assert.doesNotMatch(profileCredits, /credits-signin\.php|data-aksrt-signin-calendar/);
assert.match(profileOrders, /data-aksrt-orders-filter-panel hidden/); assert.match(profileOrders, /data-aksrt-orders-filter-panel hidden/);
assert.match(profileOrders, /'status'\s*=>\s*\$_GET\['order_status'\]\s*\?\?\s*'all'/); assert.doesNotMatch(profileOrders, /\$_GET|add_query_arg|name="order_(?:status|type|number|page)"/);
assert.match(profileOrders, /data-aksrt-orders-filter-panel hidden[\s\S]*?aksrt-orders-page__status-filters[\s\S]*?aksrt-orders-page__type-filters/); assert.match(profileOrders, /data-aksrt-orders-filter-panel hidden[\s\S]*?aksrt-orders-page__status-filters[\s\S]*?aksrt-orders-page__type-filters/);
assert.match(profileOrders, /data-aksrt-order-filter="status"[\s\S]*?data-aksrt-order-filter="type"/);
assert.match(profileOrders, /data-aksrt-order-page=/);
assert.doesNotMatch(profileOrders, /aksrt-orders-page__(?:filter-chip|page-chip|clear)[^>]*href=/);
assert.doesNotMatch(profileOrders, /aksrt-orders-page__tabs|aksrt-orders-page__tab(?:\s|<|"|')/); assert.doesNotMatch(profileOrders, /aksrt-orders-page__tabs|aksrt-orders-page__tab(?:\s|<|"|')/);
assert.match(ordersCss, /\.aksrt-orders-page__filter-panel\[hidden\]\s*\{\s*display:\s*none\s*!important;/); assert.match(ordersCss, /\.aksrt-orders-page__filter-panel\[hidden\]\s*\{\s*display:\s*none\s*!important;/);
assert.match(ordersCss, /\.aksrt-orders-page__status-filters, \.aksrt-orders-page__type-filters/); assert.match(ordersCss, /\.aksrt-orders-page__status-filters, \.aksrt-orders-page__type-filters/);
@@ -377,8 +380,12 @@ test('profile routes load versioned leaf styles and keep dialogs hidden initiall
assert.doesNotMatch(profileOrders, /can_open|entitlement_label|is-entitlement/); assert.doesNotMatch(profileOrders, /can_open|entitlement_label|is-entitlement/);
assert.doesNotMatch(orderCenterJs, /can_open|entitlement_label|is-entitlement/); assert.doesNotMatch(orderCenterJs, /can_open|entitlement_label|is-entitlement/);
assert.doesNotMatch(ordersCss, /is-entitlement/); assert.doesNotMatch(ordersCss, /is-entitlement/);
assert.match(userCenterJs, /name === 'follow' \|\| name === 'orders'/); assert.match(orderCenterJs, /function loadView\(state, patch\)/);
assert.match(userCenterJs, /\['order_status', 'order_type', 'order_number', 'order_page'\]/); assert.match(orderCenterJs, /data-aksrt-order-filter/);
assert.match(orderCenterJs, /data-aksrt-order-page/);
assert.doesNotMatch(orderCenterJs, /new URL\(window\.location\.href\)/);
assert.doesNotMatch(userCenterJs, /\['order_status', 'order_type', 'order_number', 'order_page'\]/);
assert.match(userCenterJs, /initialTab === 'orders'[\s\S]*?window\.history\.replaceState/);
}); });
test('public user home stays param-free and swaps panels via REST fragments', () => { test('public user home stays param-free and swaps panels via REST fragments', () => {