@php
$data = is_string($taxes_subdomain->data) ? json_decode($taxes_subdomain->data) : $taxes_subdomain->data;
$logo = $data->logo ?? null;
$nombre = $taxes_subdomain->nombre_fantasia ?: $taxes_subdomain->subdomain;
$labelFase = function ($f) {
return [
'round_robin' => 'Round robin', '32avos' => '32avos', '16avos' => '16avos',
'octavos' => 'Octavos', 'cuartos' => 'Cuartos', 'semifinal' => 'Semifinal',
'final' => 'Final', 'tercer_puesto' => '3er puesto', 'grupos' => 'Grupos',
][$f] ?? $f;
};
$labelEstado = function ($e) {
return [
'pendiente_disponibilidad' => 'Pendiente', 'sin_match' => 'Sin match',
'confirmado' => 'Confirmado', 'jugado' => 'Jugado', 'walkover' => 'Walkover',
'suspendido' => 'Suspendido', 'cancelado' => 'Cancelado',
][$e] ?? $e;
};
// Iniciales de un nombre para fallback de avatar
$iniciales = function ($name) {
$t = trim($name ?? '');
if (!$t) return '?';
$parts = preg_split('/\s+/', $t);
return strtoupper(mb_substr($parts[0] ?? '', 0, 1) . mb_substr($parts[count($parts)-1] ?? '', 0, 1));
};
// Render del avatar de un participante (single = 1, pareja = 2 overlap)
$avatar = function ($part) use ($iniciales) {
if (!$part) return '';
$cell = function ($url, $name) use ($iniciales) {
if ($url) {
return '';
}
return ''.e($iniciales($name)).'';
};
if (($part['tipo'] ?? null) === 'pareja') {
$urls = $part['foto_urls'] ?? [null, null];
$names = array_map('trim', explode('/', $part['nombre'] ?? ''));
return ''.$cell($urls[0] ?? null, $names[0] ?? '').$cell($urls[1] ?? null, $names[1] ?? '').'';
}
return $cell($part['foto_url'] ?? null, $part['nombre'] ?? '');
};
// Badge W.O.: el lado que no ganó lo lleva oculto (visibility:hidden) pero
// ocupando el mismo lugar; si no, esa fila queda más angosta y los
// casilleros de games dejan de alinearse con los de la otra fila.
// Mismo criterio que el bracket del admin (TenisPartidosController).
$badgeWo = function ($p, $lado) {
$oculto = $p->ganador_lado !== $lado ? ' wo-badge-ghost' : '';
return ' W.O.';
};
// Sets de un lado en celdas de ancho fijo (misma columna en fila A y B) +
// tie-break en superíndice + negrita por set ganado.
$setsLado = function ($p, $lado, $sep = ' | ') use ($badgeWo) {
$sets = $p->sets ?? collect();
$esWo = $p->estado === 'walkover';
if (count($sets) === 0) {
return $esWo ? $badgeWo($p, $lado) : '';
}
if ($esWo) {
$score = collect($sets)->map(function ($s) use ($lado) {
$g = $lado === 'a' ? $s->games_a : $s->games_b;
return ''.($g === null ? '' : (int) $g).'';
})->implode(''.e($sep).'');
return $score.$badgeWo($p, $lado);
}
return collect($sets)->map(function ($s) use ($lado) {
$g = $lado === 'a' ? $s->games_a : $s->games_b;
$gOpp = $lado === 'a' ? $s->games_b : $s->games_a;
$tb = $lado === 'a' ? $s->tie_break_a : $s->tie_break_b;
$tbOpp = $lado === 'a' ? $s->tie_break_b : $s->tie_break_a;
$huboTb = $tb !== null && $tbOpp !== null;
$gTxt = $g === null ? '' : (string) $g;
$base = $huboTb ? $gTxt.''.(int) $tb.'' : $gTxt;
$ganoSet = $g !== null && $gOpp !== null && ($g > $gOpp || ($g === $gOpp && $huboTb && $tb > $tbOpp));
return ''.($ganoSet ? ''.$base.'' : $base).'';
})->implode(''.e($sep).'');
};
// Hay algo que mostrar en la columna de resultado.
$tieneScoreVisible = function ($p) {
return (($p->sets ?? collect())->count() > 0) || $p->estado === 'walkover';
};
@endphp
| Jugador | PJ | G | P | Dif |
|---|---|---|---|---|
| {{ $f['nombre'] }} | {{ $f['pj'] }} | {{ $f['pg'] }} | {{ $f['pp'] }} | {{ $f['diff'] > 0 ? '+'.$f['diff'] : $f['diff'] }} |