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:
@@ -8,7 +8,7 @@ import api from '../../api';
|
||||
import LogoUrlField from '../../components/LogoUrlField.vue';
|
||||
import { countryDisplayName, type BuiltinCountry } from '../../data/builtinCountries';
|
||||
import {
|
||||
buildPlatformPayload,
|
||||
buildMatchUpdatePayload,
|
||||
emptyMatchForm,
|
||||
formFromDetail,
|
||||
type AdminMatchDetail,
|
||||
@@ -70,9 +70,9 @@ async function load() {
|
||||
watch(matchId, load, { immediate: true });
|
||||
|
||||
async function saveMeta() {
|
||||
let payload: ReturnType<typeof buildPlatformPayload>;
|
||||
let payload: ReturnType<typeof buildMatchUpdatePayload>;
|
||||
try {
|
||||
payload = buildPlatformPayload(form.value);
|
||||
payload = buildMatchUpdatePayload(form.value);
|
||||
} catch (e) {
|
||||
ElMessage.warning(resolveFormError(e, t));
|
||||
return;
|
||||
@@ -108,31 +108,28 @@ async function saveMeta() {
|
||||
</div>
|
||||
|
||||
<el-form label-width="72px" label-position="left" class="meta-form compact-form">
|
||||
<div class="form-section">
|
||||
<div class="form-section league-readonly-block">
|
||||
<div class="section-label">{{ t('matchEditor.group.league') }}</div>
|
||||
<el-row :gutter="12">
|
||||
<el-col :xs="24" :sm="8">
|
||||
<el-form-item :label="t('match.field.lang_zh')">
|
||||
<el-input v-model="form.leagueZh" size="small" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="8">
|
||||
<el-form-item :label="t('match.field.lang_en')">
|
||||
<el-input v-model="form.leagueEn" size="small" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="8">
|
||||
<el-form-item :label="t('match.field.lang_ms')">
|
||||
<el-input v-model="form.leagueMs" size="small" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<div class="logo-inline">
|
||||
<span class="logo-inline-label">{{ t('matchEditor.field.league_logo') }}</span>
|
||||
<LogoUrlField v-model="form.leagueLogoUrl" />
|
||||
<p class="field-hint">{{ t('matchEditor.hint.league_readonly') }}</p>
|
||||
<div class="league-readonly-grid">
|
||||
<div v-if="form.leagueLogoUrl" class="league-readonly-logo">
|
||||
<img :src="form.leagueLogoUrl" alt="" />
|
||||
</div>
|
||||
<div class="league-readonly-names">
|
||||
<div v-if="form.leagueZh.trim()" class="league-readonly-line">
|
||||
<span class="league-readonly-lang">{{ t('match.field.lang_zh') }}</span>
|
||||
<span>{{ form.leagueZh }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<div v-if="form.leagueEn.trim()" class="league-readonly-line">
|
||||
<span class="league-readonly-lang">{{ t('match.field.lang_en') }}</span>
|
||||
<span>{{ form.leagueEn }}</span>
|
||||
</div>
|
||||
<div v-if="form.leagueMs.trim()" class="league-readonly-line">
|
||||
<span class="league-readonly-lang">{{ t('match.field.lang_ms') }}</span>
|
||||
<span>{{ form.leagueMs }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-section">
|
||||
@@ -339,4 +336,45 @@ async function saveMeta() {
|
||||
.meta-form :deep(.el-input-number .el-input__inner) {
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.field-hint {
|
||||
margin: 0 0 8px;
|
||||
font-size: 12px;
|
||||
color: #8e8e93;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.league-readonly-grid {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.league-readonly-logo img {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
object-fit: contain;
|
||||
border-radius: 6px;
|
||||
background: #1a1a1a;
|
||||
}
|
||||
|
||||
.league-readonly-names {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.league-readonly-line {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
font-size: 13px;
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
.league-readonly-lang {
|
||||
flex: 0 0 28px;
|
||||
color: #8e8e93;
|
||||
font-size: 12px;
|
||||
}
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user