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

@@ -96,6 +96,7 @@ export const adminPagesMs: Record<string, string> = {
'user.btn.save_profile': 'Simpan',
'user.btn.confirm_deposit': 'Sahkan tambah baki',
'user.deposit_remark_default': 'Tambah baki admin',
'user.withdraw_remark_default': 'Pengeluaran admin',
'user.field.account_type': 'Jenis akaun',
'user.type.player': 'Pemain',
'user.type.tier1_agent': 'Ejen peringkat 1',
@@ -162,14 +163,19 @@ export const adminPagesMs: Record<string, string> = {
'finance.tx.deposit': 'Deposit',
'finance.tx.withdraw': 'Pengeluaran',
'finance.tx.request_id': 'ID permintaan',
'finance.remark.agent_deposit': 'Deposit ejen',
'finance.remark.agent_withdraw': 'Pengeluaran ejen',
'finance.remark.admin_deposit': 'Deposit admin',
'finance.remark.admin_withdraw': 'Pengeluaran admin',
'finance.remark.initial_balance': 'Baki permulaan akaun',
'agent.col.no_records': 'Tiada rekod',
'agent.btn.confirm_adjust': 'Sahkan',
'agent.field.select_user': 'Pilih pengguna',
'agent.ph.select_user': 'Cari nama pengguna pemain',
'agent.hint.select_user': 'Pilih akaun pemain sedia ada untuk naik taraf ke ejen peringkat 1',
'match.create_btn': '+ Kejohanan baharu',
'match.create_fixture_btn': '+ Perlawanan tunggal',
'match.create_btn': '+ Liga baharu',
'match.create_fixture_btn': '+ Perlawanan baharu',
'match.btn.markets': 'Pasaran',
'match.filter.keyword_ph': 'Nama kejohanan / kod pasukan',
'match.col.league': 'Kejohanan',
@@ -182,6 +188,7 @@ export const adminPagesMs: Record<string, string> = {
'match.col.matchup': 'Perlawanan',
'match.col.kickoff': 'Masa mula',
'match.dialog.create_league': 'Kejohanan baharu',
'match.dialog.edit_league': 'Edit kejohanan',
'match.dialog.create_fixture': 'Perlawanan tunggal baharu',
'match.dialog.create': 'Perlawanan tunggal baharu',
'match.dialog.edit': 'Edit perlawanan tunggal',
@@ -204,11 +211,17 @@ export const adminPagesMs: Record<string, string> = {
'match.field.away_ms': 'Pelawat (MS)',
'match.field.featured': 'Pilihan utama',
'match.hint.create_draft': 'Disimpan sebagai draf; kembangkan kejohanan dan terbitkan setiap perlawanan tunggal.',
'match.hint.create_league': 'Cipta kejohanan dahulu, kemudian kembangkan untuk tambah perlawanan tunggal.',
'match.hint.create_league': 'Kejohanan baharu tidak diterbitkan secara lalai; terbitkan untuk paparan pemain, kemudian kembangkan untuk tambah perlawanan.',
'league.status.PUBLISHED': 'Diterbitkan',
'league.status.UNPUBLISHED': 'Tidak diterbitkan',
'league.btn.unpublish': 'Nyahterbit',
'msg.league_published': 'Kejohanan diterbitkan',
'msg.league_unpublished': 'Kejohanan dinyahterbit',
'match.hint.edit_published': 'Diterbitkan: edit masa mula, pilihan utama, nama paparan; tertutup/selesai dikunci.',
'match.expand_league_hint': 'Kembangkan liga untuk urus perlawanan; odds juara di tab Odds juara.',
'match.expand_outright_hint': 'Kembangkan liga untuk sunting odds juara; pasukan perlawanan disegerakkan auto, boleh tambah pasukan belum dijadualkan.',
'outright.odds_only_hint': 'Pasukan daripada perlawanan disegerakkan auto; boleh tambah pasukan manual dan sunting odds di sini.',
'outright.fixture_sync_added': '{n} pasukan disegerakkan auto daripada perlawanan',
'outright.col.teams_from_fixtures': 'Pasukan (daripada perlawanan)',
'outright.col.teams_total': 'Pasukan odds juara',
'outright.empty_no_teams': 'Tiada pasukan — tambah perlawanan di Konfigurasi atau klik Tambah pasukan.',
@@ -365,6 +378,7 @@ export const adminPagesMs: Record<string, string> = {
'matchEditor.field.line_value': 'Garisan',
'matchEditor.ph.kickoff': 'Pilih tarikh & masa mula',
'matchEditor.group.league': 'Liga',
'matchEditor.hint.league_readonly': 'Nama dan logo liga diselenggara dalam senarai kejohanan; paparan di sini hanya baca.',
'matchEditor.group.home': 'Tuan rumah',
'matchEditor.group.away': 'Pelawat',
'matchEditor.group.schedule': 'Jadual & paparan',
@@ -441,7 +455,7 @@ export const adminPagesMs: Record<string, string> = {
'settlement.ht_score': 'Skor separuh masa',
'settlement.ft_score': 'Skor penuh masa',
'settlement.record_score': 'Simpan skor',
'settlement.preview_hint': 'Skor di atas disimpan secara automatik sebelum pratonton',
'settlement.preview_hint': 'Isi skor dan klik pratonton — skor disimpan secara automatik',
'settlement.preview_btn': 'Pratonton penyelesaian',
'settlement.preview_failed': 'Gagal menjana pratonton penyelesaian',
'settlement.err_score_not_recorded': 'Sila masukkan skor separuh masa dan penuh masa sebelum penyelesaian',
@@ -506,6 +520,7 @@ export const adminPagesMs: Record<string, string> = {
'msg.deleted': 'Dipadam',
'msg.delete_failed': 'Gagal memadam',
'msg.league_created': 'Kejohanan dicipta',
'msg.league_updated': 'Kejohanan dikemas kini',
'msg.match_created_draft': 'Perlawanan tunggal dicipta (draf)',
'msg.published': 'Diterbitkan dengan pasaran',
'msg.closed': 'Pertaruhan ditutup',
@@ -604,6 +619,16 @@ export const adminPagesMs: Record<string, string> = {
'outright.btn.add_team': 'Tambah pasukan',
'outright.add.filter_fixture': 'Pasukan sedia ada',
'outright.add.filter_all': 'Semua terbina dalam',
'outright.add.filter_custom': 'Tersuai',
'outright.add.custom_hint': 'Isi kod pasukan dan nama Cina/Inggeris; logo melalui muat naik atau URL.',
'outright.add.field_code': 'Kod pasukan',
'outright.add.field_logo': 'Logo',
'outright.add.ph_code': 'cth. TEAM01',
'outright.add.ph_name_zh': 'Nama Cina',
'outright.add.ph_name_en': 'Nama Inggeris',
'outright.add.err_code_required': 'Sila isi kod pasukan',
'outright.add.err_name_required': 'Sila isi sekurang-kurangnya nama Cina atau Inggeris',
'outright.add.err_duplicate': 'Kod pasukan ini sudah ada dalam pasaran juara',
'outright.add.select_all': 'Pilih semua',
'outright.add.clear_selection': 'Kosongkan pilihan',
'outright.add.selected_count': '{n} dipilih',