Wire match header to real SportsMatch data; add Match#/Court + country flags

The match page header rendered hard-coded demo content (Sami Al Manea vs Hassan
Al Shallan, Match# 103, referee Ghassan Yusuf, external takeone-dev links) on
EVERY match video, ignoring the SportsMatch record the create form saves.

- Video::sportsMatch() hasOne relationship.
- SportsMatch::headerData() maps the record into the header's shape (fighters +
  country flags, championship, weight class, referee, venue, match#/court),
  null-safe, with a country-name/ISO2 -> flag-icons resolver.
- match.blade header now renders from headerData(): real names/flags, no
  external links, and degrades gracefully to just title/views/date when a video
  has no match data (instead of the fake card).
- sports-match-modal: add Match # and Court fields (stored in the existing
  competition JSON, no migration) and convert fighter/referee country inputs to
  the mandated <x-country-select> so header flags resolve from ISO2.
- Tracker updated for the new country-select usages.

Verified: empty state (no SportsMatch) shows only title/views/date; a populated
record renders fighters, flags (bh/us), championship, Match# 42, Court 3, U21,
referee; modal compiles with the new fields.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
ghassanandClaude Opus 4.8 committed 2026-07-29 01:57:07 +03:00
1 parent 8ea63a6720
commit af276f2cd1
5 files changed
+150 -100

No files matched your search

+6
View File
@@ -434,6 +434,12 @@ class Video extends Model
return $this->hasMany(CoachReview::class)->orderBy('start_time_seconds');
}
// The sports match record backing a type=match video (fighters, referee, etc.)
public function sportsMatch()
{
return $this->hasOne(SportsMatch::class);
}
// Get recent views count (within hours)
public function getRecentViews($hours = 48)
{