sync(theme-2): 从 main 同步优胜赛结算态与钱包流水展示优化

- checkout shared/api/admin 自 d3c2114
- player: outright 结算态逻辑、wallet txAmountClass、i18n 新增 key(保留蓝白主题样式)
This commit is contained in:
2026-06-23 13:49:43 +08:00
parent 021d216613
commit 26e2adf786
36 changed files with 577 additions and 127 deletions

View File

@@ -3,6 +3,7 @@ import { ref, computed, watch, onBeforeUnmount, onDeactivated } from 'vue';
defineOptions({ name: 'AdminMatches' });
import { useStaleListLifecycle } from '../composables/useStaleList';
import { consumeAdminListStale } from '../utils/adminListStale';
import { useRoute, useRouter } from 'vue-router';
import { useAdminLocale } from '../composables/useAdminLocale';
import { resolveFormError } from '../i18n/form-validation';
@@ -38,6 +39,7 @@ const isMatchChildRoute = computed(() =>
interface LeagueTableRow extends Record<string, unknown> {
id: string;
isPublished: boolean;
isOutrightSettled: boolean;
isPublishing: boolean;
labels: {
edit: string;
@@ -50,7 +52,7 @@ interface LeagueTableRow extends Record<string, unknown> {
displayNameZh: string;
displayNameEn: string;
displayStatusLabel: string;
displayStatusTagType: 'success' | 'info';
displayStatusTagType: 'success' | 'info' | 'warning';
displayMatchCount: number;
displayBetCount: number;
displayBetCountActive: boolean;
@@ -121,6 +123,7 @@ function mapLeagueRows(items: unknown[], publishingId = ''): LeagueTableRow[] {
const r = rowOf(item);
const id = String(r.id ?? '');
const published = Boolean(r.isPublished);
const outrightSettled = Boolean(r.isOutrightSettled);
const stats = r.betStats as
| { betCount?: number; totalStake?: string; pendingCount?: number }
| undefined;
@@ -129,13 +132,18 @@ function mapLeagueRows(items: unknown[], publishingId = ''): LeagueTableRow[] {
...r,
id,
isPublished: published,
isOutrightSettled: outrightSettled,
isPublishing: publishingId === id,
labels,
displaySeq: start + index + 1,
displayNameZh: String(r.leagueZh ?? '').trim() || '—',
displayNameEn: String(r.leagueEn ?? '').trim() || '—',
displayStatusLabel: published ? t('league.status.PUBLISHED') : t('league.status.UNPUBLISHED'),
displayStatusTagType: published ? 'success' : 'info',
displayStatusLabel: outrightSettled
? t('league.status.OUTRIGHT_SETTLED')
: published
? t('league.status.PUBLISHED')
: t('league.status.UNPUBLISHED'),
displayStatusTagType: outrightSettled ? 'warning' : published ? 'success' : 'info',
displayMatchCount: Number(r.matchCount ?? 0),
displayBetCount: betCount,
displayBetCountActive: betCount > 0,
@@ -163,6 +171,7 @@ function persistListUiState() {
type LoadOptions = { restore?: boolean };
async function load(options: LoadOptions = {}) {
consumeAdminListStale();
const saved = options.restore ? readMatchesListUiState() : null;
if (saved) {
page.value = saved.page;
@@ -189,6 +198,17 @@ function onSearch() {
void runLoad(true);
}
const MATCH_CHILD_ROUTE = /^\/matches\/leagues\/[^/]+/;
watch(
() => route.path,
(path, prevPath) => {
if (prevPath && MATCH_CHILD_ROUTE.test(prevPath) && path === '/matches') {
void load();
}
},
);
async function initialLoad() {
if (isMatchChildRoute.value) return;
const qStatus = route.query.status;