Files
Laucha1312 cc049c6cb6 3
2026-06-04 15:20:26 -03:00

289 lines
14 KiB
PHP

@extends('admin.layout')
@section('title', ($evento ? 'Editar' : 'Nuevo') . ' Evento - Admin OnAPB')
@section('content')
<div class="page-header">
<h2><i class="bi bi-calendar-event-fill"></i> {{ $evento ? 'Editar Evento' : 'Nuevo Evento' }}</h2>
<a href="{{ route('admin.eventos.index') }}" class="btn-admin-outline">
<i class="bi bi-arrow-left"></i> Volver
</a>
</div>
<div class="admin-card">
<div class="card-body">
<form method="POST" action="{{ $evento ? route('admin.eventos.update', $evento->id_evento) : route('admin.eventos.store') }}" class="admin-form">
@csrf
@if($evento) @method('PUT') @endif
<div class="row">
<div class="col-md-8">
<div class="mb-3">
<label class="form-label">Nombre del Evento (Opcional)</label>
<input type="text" name="nombre_evento" class="form-control" value="{{ old('nombre_evento', $evento->nombre_evento ?? '') }}" placeholder="Ej: Paracao vs Talleres (Primera A)" {{ session('admin_role') == 2 ? 'readonly' : '' }}>
<small class="text-muted">Si se deja en blanco, se generará automáticamente usando los nombres de los clubes.</small>
@error('nombre_evento')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
</div>
<div class="col-md-4">
<div class="mb-3">
<label class="form-label text-primary fw-bold">Torneo</label>
<select name="id_torneo" id="id_torneo" class="form-select border-primary" {{ (session('admin_role') == 2 || $evento) ? 'disabled' : '' }}>
<option value=""> Ninguno / Amistoso </option>
@foreach($torneos as $t)
<option value="{{ $t->id }}" {{ old('id_torneo', $evento->id_torneo ?? '') == $t->id ? 'selected' : '' }}>
{{ $t->nombre }}
</option>
@endforeach
</select>
@if($evento)
<input type="hidden" name="id_torneo" value="{{ $evento->id_torneo }}">
@endif
@error('id_torneo')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
</div>
<div class="col-md-4">
<div class="mb-3">
<label class="form-label text-primary fw-bold">Grupo / Zona</label>
<select id="select_grupo" class="form-select border-primary" {{ (session('admin_role') == 2 || $evento) ? 'disabled' : '' }}>
<option value="">Seleccione Torneo primero...</option>
</select>
<small class="text-muted">Solo obligatorio para torneos.</small>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="mb-3">
<label class="form-label">Fecha *</label>
<input type="date" name="fecha_evento" class="form-control" value="{{ old('fecha_evento', $evento && $evento->fecha_evento ? \Carbon\Carbon::parse($evento->fecha_evento)->format('Y-m-d') : '') }}" required>
</div>
</div>
<div class="col-md-4">
<div class="mb-3">
<label class="form-label">Hora Inicio *</label>
<input type="time" name="hora_inicio" class="form-control" value="{{ old('hora_inicio', $evento ? substr($evento->hora_inicio, 0, 5) : '') }}" required>
</div>
</div>
<div class="col-md-4">
<div class="mb-3">
<label class="form-label">Hora Fin *</label>
<input type="time" name="hora_fin" class="form-control" value="{{ old('hora_fin', $evento ? substr($evento->hora_fin, 0, 5) : '') }}" required>
</div>
</div>
</div>
<div class="row">
<div class="col-md-4">
<div class="mb-3">
<label class="form-label">Sede *</label>
<input type="text" name="sede" class="form-control" value="{{ old('sede', $evento->sede ?? '') }}" {{ session('admin_role') == 2 ? 'readonly' : '' }} required>
</div>
</div>
<div class="col-md-4">
<div class="mb-3">
<label class="form-label">Equipo Local *</label>
<select name="id_equipo_local" id="id_equipo_local" class="form-select equipo-select" {{ $evento ? 'disabled' : '' }} required>
<option value="">Seleccionar...</option>
@foreach($equipos as $eq)
<option value="{{ $eq->id_equipo }}"
data-torneos="{{ $eq->torneos->pluck('id')->join(',') }}"
{{ old('id_equipo_local', $evento->id_equipo_local ?? '') == $eq->id_equipo ? 'selected' : '' }}>
{{ $eq->club->nombre ?? '?' }} - {{ $eq->categoria }} {{ $eq->division }}
</option>
@endforeach
</select>
@if($evento)
<input type="hidden" name="id_equipo_local" value="{{ $evento->id_equipo_local }}">
@endif
</div>
</div>
<div class="col-md-4">
<div class="mb-3">
<label class="form-label">Equipo Visitante *</label>
<select name="id_equipo_visitante" id="id_equipo_visitante" class="form-select equipo-select" {{ $evento ? 'disabled' : '' }} required>
<option value="">Seleccionar...</option>
@foreach($equipos as $eq)
<option value="{{ $eq->id_equipo }}"
data-torneos="{{ $eq->torneos->pluck('id')->join(',') }}"
{{ old('id_equipo_visitante', $evento->id_equipo_visitante ?? '') == $eq->id_equipo ? 'selected' : '' }}>
{{ $eq->club->nombre ?? '?' }} - {{ $eq->categoria }} {{ $eq->division }}
</option>
@endforeach
</select>
@if($evento)
<input type="hidden" name="id_equipo_visitante" value="{{ $evento->id_equipo_visitante }}">
@endif
</div>
</div>
</div>
<div class="row">
<div class="col-md-3">
<div class="mb-3">
<label class="form-label">Precio ($)</label>
<input type="number" step="0.01" name="precio" class="form-control" value="{{ old('precio', $evento->precio ?? 0) }}" {{ session('admin_role') == 2 ? 'readonly' : '' }}>
</div>
</div>
<div class="col-md-3">
<div class="mb-3">
<label class="form-label">Límite QRs por Jugador *</label>
<input type="number" name="limite_qr_jugador" class="form-control" value="{{ old('limite_qr_jugador', $evento->limite_qr_jugador ?? 3) }}" required min="0">
</div>
</div>
<div class="col-md-6">
<div class="p-3 bg-light rounded border border-primary border-opacity-25">
<label class="form-label d-block fw-bold text-primary mb-3"><i class="bi bi-scoreboard"></i> RESULTADO FINAL (Opcional)</label>
<div class="d-flex align-items-center gap-3">
<div class="flex-grow-1">
<small class="text-muted d-block mb-1 text-center">LOCAL</small>
<input type="number" name="marcador_local" class="form-control text-center fs-4 fw-bold" value="{{ old('marcador_local', $evento->marcador_local ?? 0) }}" min="0">
</div>
<div class="pt-3 fs-3 fw-bold">:</div>
<div class="flex-grow-1">
<small class="text-muted d-block mb-1 text-center">VISITANTE</small>
<input type="number" name="marcador_visitante" class="form-control text-center fs-4 fw-bold" value="{{ old('marcador_visitante', $evento->marcador_visitante ?? 0) }}" min="0">
</div>
</div>
</div>
</div>
</div>
<div class="mt-4">
<button type="submit" class="btn-admin-primary px-5 py-3">
<i class="bi bi-check-lg me-2"></i> {{ $noticia ?? '' ? 'Actualizar' : ($evento ? 'ACTUALIZAR EVENTO' : 'CREAR EVENTO') }}
</button>
</div>
</form>
</div>
</div>
@endsection
@section('scripts')
<script>
document.addEventListener('DOMContentLoaded', function() {
const torneoSelect = document.getElementById('id_torneo');
const grupoSelect = document.getElementById('select_grupo');
const equipoLocalSelect = document.getElementById('id_equipo_local');
const equipoVisitanteSelect = document.getElementById('id_equipo_visitante');
// Inyectamos el mapeo desde PHP
const mapping = @json($torneoEquipos);
// Equipos actuales (para cuando no hay torneo)
const initialEquiposHtml = equipoLocalSelect.innerHTML;
function updateGroups() {
const torneoId = torneoSelect.value;
grupoSelect.innerHTML = '';
if (!torneoId) {
grupoSelect.innerHTML = '<option value="">N/A (Amistoso)</option>';
grupoSelect.disabled = true;
unlockTeams(true); // Desbloquear para amistosos
return;
}
// Obtener grupos únicos para este torneo
const grupos = [...new Set(mapping.filter(m => m.id_torneo == torneoId).map(m => m.grupo || 'General'))];
grupoSelect.innerHTML = '<option value="">Seleccione Grupo...</option>';
grupos.forEach(g => {
const opt = document.createElement('option');
opt.value = g;
opt.textContent = g;
grupoSelect.appendChild(opt);
});
grupoSelect.disabled = false;
unlockTeams(false); // Bloquear equipos hasta elegir grupo
}
function unlockTeams(unlock) {
equipoLocalSelect.disabled = !unlock;
equipoVisitanteSelect.disabled = !unlock;
if (!unlock) {
equipoLocalSelect.value = "";
equipoVisitanteSelect.value = "";
}
}
function filterEquiposByGroup() {
const torneoId = torneoSelect.value;
const grupo = grupoSelect.value;
if (!torneoId) {
// Caso amistoso: restaurar todos
equipoLocalSelect.innerHTML = initialEquiposHtml;
equipoVisitanteSelect.innerHTML = initialEquiposHtml;
unlockTeams(true);
return;
}
if (!grupo) {
unlockTeams(false);
return;
}
// Obtener equipos del torneo y grupo
const equiposInGroup = mapping.filter(m => m.id_torneo == torneoId && (m.grupo == grupo || (!m.grupo && grupo == 'General')));
const idsInGroup = equiposInGroup.map(m => m.id_equipo.toString());
[equipoLocalSelect, equipoVisitanteSelect].forEach(select => {
const currentVal = select.value;
select.innerHTML = '<option value="">Seleccionar...</option>';
// Re-poblar solo con los válidos
const parser = new DOMParser();
const doc = parser.parseFromString(`<div>${initialEquiposHtml}</div>`, 'text/html');
const originalOptions = doc.querySelectorAll('option');
originalOptions.forEach(opt => {
if (opt.value && idsInGroup.includes(opt.value)) {
const newOpt = document.createElement('option');
newOpt.value = opt.value;
newOpt.textContent = opt.textContent;
select.appendChild(newOpt);
}
});
select.disabled = false;
});
}
torneoSelect.addEventListener('change', updateGroups);
grupoSelect.addEventListener('change', filterEquiposByGroup);
// Manejar estado inicial (Edición)
if (torneoSelect.value) {
updateGroups();
// Intentar inferir el grupo del equipo local
const firstTeamId = document.getElementsByName('id_equipo_local')[0].value;
if (firstTeamId) {
const rel = mapping.find(m => m.id_torneo == torneoSelect.value && m.id_equipo == firstTeamId);
if (rel) {
grupoSelect.value = rel.grupo || 'General';
filterEquiposByGroup();
// Asegurar que los selectores (aunque deshabilitados) muestren los equipos correctos
@if($evento)
equipoLocalSelect.value = "{{ $evento->id_equipo_local }}";
equipoVisitanteSelect.value = "{{ $evento->id_equipo_visitante }}";
@endif
}
}
} else {
// Si no hay torneo y no es edición restringida, dejar libre
@if(!$evento)
unlockTeams(true);
@endif
}
});
</script>
@endsection