feat: split admin dashboard, improve match ops, and player closed-match UX

Admin: add match/player overview sub-nav; refine settlement flow and league
match management UI; improve action button enabled/disabled styles; enhance
logo upload and outright odds sync.

API: expose matchPhase/bettingOpen for closed matches; league publish guards;
settlement preview with auto score save; outright team auto-sync.

Player: watermark for closed/settled states; keep match and bet details visible;
remove default login credentials.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-10 13:00:14 +08:00
parent 6124313369
commit 03f54ca689
43 changed files with 2787 additions and 519 deletions

View File

@@ -15,7 +15,7 @@ const sidebarOpen = ref(false);
const isMobileNav = ref(false);
const adminMenus = computed(() => [
{ path: '/', label: t('nav.dashboard') },
{ path: '/', label: t('nav.dashboard'), matchPrefix: true },
{ path: '/matches', label: t('nav.matches'), matchPrefix: true },
{ path: '/users', label: t('nav.agents_players') },
{ path: '/finance-logs', label: t('nav.finance_logs') },
@@ -45,9 +45,14 @@ function isMatchesSectionPath(path: string) {
);
}
function isDashboardSectionPath(path: string) {
return path === '/' || path === '/dashboard/players';
}
const currentLabel = computed(() => {
const hit = menus.value.find((m) => {
if ('matchPrefix' in m && m.matchPrefix) {
if (m.path === '/') return isDashboardSectionPath(route.path);
return isMatchesSectionPath(route.path);
}
return route.path === m.path;
@@ -136,7 +141,11 @@ watch(() => route.path, () => {
:class="{
active:
route.path === m.path ||
('matchPrefix' in m && m.matchPrefix && isMatchesSectionPath(route.path)),
('matchPrefix' in m &&
m.matchPrefix &&
(m.path === '/'
? isDashboardSectionPath(route.path)
: isMatchesSectionPath(route.path))),
}"
@click="onNavClick"
>