' + escapeHtml(order.product_name || "订单") + '
订单号 ' + escapeHtml(order.order_number) + '
diff --git a/assets/css/routes/commerce.css b/assets/css/routes/commerce.css index 9b86cda9..8b9ca04f 100644 --- a/assets/css/routes/commerce.css +++ b/assets/css/routes/commerce.css @@ -1,5 +1,5 @@ /** - * Commerce center shared shell (cart / orders / revenue). + * Commerce center shared shell (cart / revenue). * * @package AKSRT */ @@ -32,8 +32,8 @@ display: inline-flex; align-items: center; padding: 6px 12px; - border-radius: 999px; border: 1px solid var(--color-line, rgba(0, 0, 0, 0.08)); + border-radius: 999px; background: var(--surface-1, #fff); color: var(--color-ink-2, #4b5563); font-size: 13px; @@ -42,14 +42,14 @@ } .aksrt-commerce-header__nav-item:hover { - color: var(--color-primary, #f04494); border-color: color-mix(in srgb, var(--color-primary, #f04494) 45%, transparent); + color: var(--color-primary, #f04494); } .aksrt-commerce-header__nav-item.is-active { - color: var(--color-on-primary, #fff); - background: var(--color-primary, #f04494); border-color: transparent; + background: var(--color-primary, #f04494); + color: var(--color-on-primary, #fff); } /* Soften revenue dashboard cards — task-first, not ops console */ @@ -60,18 +60,18 @@ .aksrt-revenue-page__stat-card { padding: 14px 16px !important; - border-radius: 12px !important; - box-shadow: none !important; border: 1px solid var(--color-line-soft, rgba(0, 0, 0, 0.06)) !important; + border-radius: 12px !important; background: var(--surface-1, #fff) !important; + box-shadow: none !important; } .aksrt-revenue-page__stat-icon { width: 36px !important; height: 36px !important; - font-size: 15px !important; background: var(--body-bg-color, #f5f6f7) !important; color: var(--color-ink-2, #4b5563) !important; + font-size: 15px !important; } .aksrt-revenue-page__stat-value { @@ -83,98 +83,6 @@ font-size: 12px !important; } -/* Orders / cart title rhythm when using shared header */ -.aksrt-orders-page__header, .aksrt-cart-page__header > div:first-child { margin-bottom: 0; } - -.aksrt-orders-page__tabs { - margin-top: 4px; -} - - -/* After-sale multi-step + coupon wallet */ -.aksrt-orders-page__extra-nav { - display: flex; - flex-wrap: wrap; - gap: 8px; - margin: 0 0 12px; -} -.aksrt-orders-page__extra-link { - padding: 6px 12px; - border-radius: 999px; - background: var(--surface-2, #f3f4f6); - color: inherit; - text-decoration: none; - font-size: 13px; -} -.aksrt-orders-page__extra-link.is-active { - background: var(--focus-color, var(--color-primary)); - color: #fff; -} -.aksrt-as-list { display: grid; gap: 12px; } -.aksrt-as-card { - border: 1px solid var(--main-border-color, #eee); - border-radius: 10px; - padding: 14px; - background: var(--main-bg-color, #fff); -} -.aksrt-as-card__head { - display: flex; - flex-wrap: wrap; - gap: 8px; - align-items: center; - margin-bottom: 6px; -} -.aksrt-as-card__status { - margin-left: auto; - color: var(--focus-color, #2f6df6); - font-weight: 600; -} -.aksrt-as-timeline { - margin: 10px 0 0; - padding-left: 18px; - color: var(--muted-2-color, #888); - font-size: 12px; -} -.aksrt-as-card__actions { - display: flex; - gap: 8px; - margin-top: 10px; -} -.aksrt-coupon-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); - gap: 12px; -} -.aksrt-coupon-card { - border: 1px dashed var(--focus-color, #2f6df6); - border-radius: 10px; - padding: 12px; - background: color-mix(in srgb, var(--focus-color, #2f6df6) 6%, #fff); -} -.aksrt-coupon-card__value { - font-size: 20px; - font-weight: 700; - color: var(--focus-color, #2f6df6); -} -.aksrt-coupon-card__code { - font-family: ui-monospace, monospace; - margin: 6px 0; -} -.aksrt-coupon-card__meta { - font-size: 12px; - color: var(--muted-2-color, #888); - margin-bottom: 4px; -} -.aksrt-orders-page__field { margin-bottom: 12px; } -.aksrt-orders-page__input, -.aksrt-orders-page__select, -.aksrt-orders-page__textarea { - width: 100%; - box-sizing: border-box; - padding: 8px 10px; - border: 1px solid var(--main-border-color, #ddd); - border-radius: 6px; -} diff --git a/assets/css/routes/orders.css b/assets/css/routes/orders.css index 96b8e09c..c5146549 100644 --- a/assets/css/routes/orders.css +++ b/assets/css/routes/orders.css @@ -47,10 +47,10 @@ .aksrt-orders-page__search { display: flex; gap: 8px; align-items: center; margin: 20px 0 12px; padding: 7px; border: 1px solid var(--orders-line); border-radius: 12px; background: var(--surface-1, #fff); } .aksrt-orders-page__search > i { margin-left: 7px; color: var(--orders-muted); font-size: 13px; } .aksrt-orders-page__search input { flex: 1; min-width: 0; border: 0; outline: 0; background: transparent; color: var(--orders-ink); font-size: 13px; } -.aksrt-orders-page__search button, .aksrt-orders-page__card-actions .btn-primary, .aksrt-orders-page__card-actions .btn-outline, .aksrt-orders-page__card-actions .btn-ghost, .aksrt-orders-page__empty .btn-outline, .aksrt-modal__footer .btn-primary, .aksrt-modal__footer .btn-outline, .aksrt-modal__footer .btn-ghost { display: inline-flex; align-items: center; justify-content: center; min-height: 34px; padding: 0 13px; border-radius: 8px; border: 1px solid transparent; font-size: 12px; font-weight: 650; text-decoration: none; cursor: pointer; } -.aksrt-orders-page .btn-primary, .aksrt-modal__footer .btn-primary { background: var(--color-primary, #3b82f6); color: var(--color-on-primary, #fff); } -.aksrt-orders-page .btn-outline, .aksrt-modal__footer .btn-outline { border-color: var(--orders-line); background: var(--surface-1, #fff); color: var(--orders-ink); } -.aksrt-orders-page .btn-ghost, .aksrt-modal__footer .btn-ghost { background: transparent; color: var(--orders-muted); } +.aksrt-orders-page__search button, .aksrt-orders-page__card-actions .btn-primary, .aksrt-orders-page__card-actions .btn-outline, .aksrt-orders-page__card-actions .btn-ghost, .aksrt-orders-page__empty .btn-outline, .aksrt-order-detail__actions .btn-primary, .aksrt-order-detail__actions .btn-outline, .aksrt-order-detail__actions .btn-ghost { display: inline-flex; align-items: center; justify-content: center; min-height: 34px; padding: 0 13px; border-radius: 8px; border: 1px solid transparent; font-size: 12px; font-weight: 650; text-decoration: none; cursor: pointer; } +.aksrt-orders-page .btn-primary, .aksrt-order-detail__actions .btn-primary { background: var(--color-primary, #3b82f6); color: var(--color-on-primary, #fff); } +.aksrt-orders-page .btn-outline, .aksrt-order-detail__actions .btn-outline { border-color: var(--orders-line); background: var(--surface-1, #fff); color: var(--orders-ink); } +.aksrt-orders-page .btn-ghost, .aksrt-order-detail__actions .btn-ghost { background: transparent; color: var(--orders-muted); } .aksrt-orders-page__filter-toggle { background: var(--surface-2, #f4f6f9); color: var(--orders-ink); white-space: nowrap; } .aksrt-orders-page__filter-panel { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin: -2px 0 14px; padding: 12px; border-radius: 10px; background: var(--surface-2, #f4f6f9); } @@ -60,7 +60,7 @@ .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__clear { margin-left: auto; color: var(--color-primary, #3b82f6); font-size: 12px; text-decoration: none; } -.aksrt-orders-page__tabs { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0; margin: 0 0 14px; border-bottom: 1px solid var(--orders-line); } +.aksrt-orders-page__tabs { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0; margin: 4px 0 14px; border-bottom: 1px solid var(--orders-line); } .aksrt-orders-page__tab { position: relative; padding: 11px 8px; color: var(--orders-muted); text-align: center; font-size: 13px; font-weight: 650; text-decoration: none; } .aksrt-orders-page__tab.is-active { color: var(--orders-ink); } .aksrt-orders-page__tab.is-active::after { position: absolute; right: 28%; bottom: -1px; left: 28%; height: 2px; border-radius: 2px; background: var(--color-primary, #3b82f6); content: ""; } @@ -94,9 +94,25 @@ .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-modal__footer { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 7px; padding: 12px 16px; border-top: 1px solid var(--orders-line); background: var(--surface-2, #f7f8fb); } +.aksrt-order-detail__actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 7px; padding: 12px 16px; border-top: 1px solid var(--orders-line); background: var(--surface-2, #f7f8fb); } .aksrt-order-detail__hero { display: flex; align-items: center; justify-content: space-between; padding: 15px; border-radius: 11px; background: color-mix(in srgb, var(--color-primary, #3b82f6) 9%, var(--surface-2, #f7f8fb)); }.aksrt-order-detail__hero.is-pending { background: color-mix(in srgb, var(--color-warning, #c87819) 11%, var(--surface-2, #f7f8fb)); }.aksrt-order-detail__hero.is-completed { background: color-mix(in srgb, var(--color-success, #168560) 10%, var(--surface-2, #f7f8fb)); }.aksrt-order-detail__status-pill { font-size: 12px; font-weight: 700; }.aksrt-order-detail__hero-amount { font-size: 23px; font-variant-numeric: tabular-nums; }.aksrt-order-detail__product { display: grid; grid-template-columns: 56px minmax(0, 1fr); gap: 11px; align-items: center; }.aksrt-order-detail__thumb { width: 56px; height: 56px; border-radius: 10px; object-fit: cover; }.aksrt-order-detail__thumb--empty { display: grid; place-items: center; background: var(--surface-2, #f4f6f9); color: var(--color-primary, #3b82f6); }.aksrt-order-detail__product-title { display: block; line-height: 1.4; }.aksrt-order-detail__product-meta { display: block; margin-top: 5px; color: var(--orders-muted); font-size: 12px; }.aksrt-order-detail__list { margin: 0; border: 1px solid var(--orders-line); border-radius: 10px; overflow: hidden; }.aksrt-order-detail__list > div { display: grid; grid-template-columns: 86px minmax(0, 1fr); padding: 10px 12px; border-bottom: 1px solid var(--orders-line); font-size: 12px; }.aksrt-order-detail__list > div:last-child { border-bottom: 0; }.aksrt-order-detail__list dt { color: var(--orders-muted); }.aksrt-order-detail__list dd { margin: 0; overflow-wrap: anywhere; text-align: right; font-variant-numeric: tabular-nums; } -@media (max-width: 767px) { .uc-orders-panel__head { grid-template-columns: 1fr; gap: 17px; }.aksrt-orders-page__stats { max-width: none; }.aksrt-orders-page__search { flex-wrap: wrap; }.aksrt-orders-page__search input { min-width: 150px; }.aksrt-orders-page__search .btn-primary { margin-left: auto; }.aksrt-orders-page__filter-toggle { margin-left: auto; }.aksrt-orders-page__card-rail time { width: 100%; margin-left: 0; order: 3; }.aksrt-orders-page__card-main { grid-template-columns: 48px minmax(0, 1fr); }.aksrt-orders-page__card-img, .aksrt-orders-page__card-art { width: 48px; height: 48px; }.aksrt-orders-page__card-value { grid-column: 2; text-align: left; }.aksrt-orders-page__card-actions > :not(.aksrt-orders-page__countdown) { flex: 1 1 auto; }.aksrt-orders-page__countdown { width: 100%; }.aksrt-modal__footer > * { flex: 1; } } -@media (prefers-reduced-motion: reduce) { .aksrt-orders-page__card { transition: none; } } -html.dark .aksrt-orders-page__stat, html.dark .aksrt-orders-page__card { background: var(--surface-1, #1a1d24); } html.dark .aksrt-orders-page__card-rail, html.dark .aksrt-orders-page__filter-panel, html.dark .aksrt-modal__footer { background: var(--surface-2, #12151b); } +/* Orders extensions */ +.aksrt-orders-page__extra-nav { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 12px; } +.aksrt-orders-page__extra-link { padding: 6px 12px; border-radius: 999px; background: var(--surface-2, #f3f4f6); color: inherit; text-decoration: none; font-size: 13px; } +.aksrt-orders-page__extra-link.is-active { background: var(--focus-color, var(--color-primary)); color: #fff; } +.aksrt-as-list { display: grid; gap: 12px; } +.aksrt-as-card { padding: 14px; border: 1px solid var(--main-border-color, #eee); border-radius: 10px; background: var(--main-bg-color, #fff); } +.aksrt-as-card__head { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-bottom: 6px; } +.aksrt-as-card__status { margin-left: auto; color: var(--focus-color, #2f6df6); font-weight: 600; } +.aksrt-as-timeline { margin: 10px 0 0; padding-left: 18px; color: var(--muted-2-color, #888); font-size: 12px; } +.aksrt-as-card__actions { display: flex; gap: 8px; margin-top: 10px; } +.aksrt-coupon-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 12px; } +.aksrt-coupon-card { padding: 12px; border: 1px dashed var(--focus-color, #2f6df6); border-radius: 10px; background: color-mix(in srgb, var(--focus-color, #2f6df6) 6%, #fff); } +.aksrt-coupon-card__value { color: var(--focus-color, #2f6df6); font-size: 20px; font-weight: 700; } +.aksrt-coupon-card__code { margin: 6px 0; font-family: ui-monospace, monospace; } +.aksrt-coupon-card__meta { margin-bottom: 4px; color: var(--muted-2-color, #888); font-size: 12px; } +.aksrt-orders-page__field { margin-bottom: 12px; } +.aksrt-orders-page__input, .aksrt-orders-page__select, .aksrt-orders-page__textarea { box-sizing: border-box; width: 100%; padding: 8px 10px; border: 1px solid var(--main-border-color, #ddd); border-radius: 6px; } +@media (max-width: 767px) { .uc-orders-panel__head { grid-template-columns: 1fr; gap: 17px; }.aksrt-orders-page__stats { max-width: none; }.aksrt-orders-page__search { flex-wrap: wrap; }.aksrt-orders-page__search input { min-width: 150px; }.aksrt-orders-page__search .btn-primary { margin-left: auto; }.aksrt-orders-page__filter-toggle { margin-left: auto; }.aksrt-orders-page__card-rail time { width: 100%; margin-left: 0; order: 3; }.aksrt-orders-page__card-main { grid-template-columns: 48px minmax(0, 1fr); }.aksrt-orders-page__card-img, .aksrt-orders-page__card-art { width: 48px; height: 48px; }.aksrt-orders-page__card-value { grid-column: 2; text-align: left; }.aksrt-orders-page__card-actions > :not(.aksrt-orders-page__countdown) { flex: 1 1 auto; }.aksrt-orders-page__countdown { width: 100%; }.aksrt-order-detail__actions > * { flex: 1; } } +html.dark .aksrt-orders-page__stat, html.dark .aksrt-orders-page__card { background: var(--surface-1, #1a1d24); } html.dark .aksrt-orders-page__card-rail, html.dark .aksrt-orders-page__filter-panel, html.dark .aksrt-order-detail__actions { background: var(--surface-2, #12151b); } diff --git a/assets/js/order-center.js b/assets/js/order-center.js index ae5169e7..b21ba788 100644 --- a/assets/js/order-center.js +++ b/assets/js/order-center.js @@ -3,19 +3,10 @@ * * @package AKSRT */ - (function () { "use strict"; - var page = document.querySelector("[data-aksrt-order-center]"); - if (!page) return; - if (!window.AksrtModalRuntime.isRolloutEnabled("order")) return; - - var detailOrderNumber = ""; - var detailAutoRefreshStarted = false; - var detailSession = null; - var detailReplacement = false; - var detailReplacementSession = null; + var instances = new WeakMap(); function toast(message, type) { window.AksrtToast(message, type || "info"); @@ -50,15 +41,6 @@ : "¥" + amount.toFixed(2); } - function activeDetail(number) { - return detailOrderNumber === number - && !!detailSession - && !detailSession.closed - && detailSession.options - && detailSession.options.kind === "orders" - && window.AksrtModalRuntime.getActive() === detailSession.shell; - } - function orderTag(orderNumber) { return "order:" + String(orderNumber || "").toLowerCase(); } @@ -71,6 +53,15 @@ window.AksrtModalRuntime.invalidate(tags); } + function activeDetail(state, number) { + return state.detailOrderNumber === number + && !!state.detailSession + && !state.detailSession.closed + && state.detailSession.options + && state.detailSession.options.kind === "orders" + && window.AksrtModalRuntime.getActive() === state.detailSession.shell; + } + function detailSkeleton() { return '
订单不存在
'; return; } - renderDetail(data, session); - if (!refresh && !detailAutoRefreshStarted && data.reconciliation && data.reconciliation.state === "refresh_available") { - detailAutoRefreshStarted = true; + renderDetail(state, data, session); + if (!refresh && !state.detailAutoRefreshStarted && data.reconciliation && data.reconciliation.state === "refresh_available") { + state.detailAutoRefreshStarted = true; window.setTimeout(function () { - if (activeDetail(orderNumber)) refreshDetail(orderNumber); + if (activeDetail(state, orderNumber)) refreshDetail(state, orderNumber); }, 0); } }, @@ -147,27 +138,27 @@ }; } - function openDetail(orderNumber) { + function openDetail(state, orderNumber) { if (!orderNumber) return; - detailSession = null; - detailReplacement = false; - detailReplacementSession = null; - detailOrderNumber = orderNumber; - detailAutoRefreshStarted = false; - window.AksrtModalRuntime.openRemote(detailOptions(orderNumber, false)); + state.detailSession = null; + state.detailReplacement = false; + state.detailReplacementSession = null; + state.detailOrderNumber = orderNumber; + state.detailAutoRefreshStarted = false; + window.AksrtModalRuntime.openRemote(detailOptions(state, orderNumber, false)); } - function refreshDetail(orderNumber) { - if (!orderNumber || !activeDetail(orderNumber)) return; - detailReplacement = true; - detailReplacementSession = detailSession; - var refreshPromise = window.AksrtModalRuntime.openRemote(detailOptions(orderNumber, true)); + function refreshDetail(state, orderNumber) { + if (!orderNumber || !activeDetail(state, orderNumber)) return; + state.detailReplacement = true; + state.detailReplacementSession = state.detailSession; + var refreshPromise = window.AksrtModalRuntime.openRemote(detailOptions(state, orderNumber, true)); refreshPromise.then(function () { - detailReplacement = false; - detailReplacementSession = null; + state.detailReplacement = false; + state.detailReplacementSession = null; }, function () { - detailReplacement = false; - detailReplacementSession = null; + state.detailReplacement = false; + state.detailReplacementSession = null; }); } @@ -196,21 +187,21 @@ ? '' : ""; return '订单号 ' + escapeHtml(order.order_number) + '
订单号 " + escapeHtml(order.order_number) + "