feat: módulo de evaluaciones para admin con constructor dinámico
- Modelos completos: Evaluacion, EvaluacionTipo, Pregunta, PreguntaTipo,
PreguntaOpcion, EvaluacionSubmission, Respuesta (con $table explícito
para nombres en español que Laravel pluraliza incorrectamente)
- Relaciones evaluaciones() añadidas a Plantel y Nivel
- EvaluacionBuilder (Livewire): constructor interactivo con preguntas
de tipo texto libre, opción múltiple, escala 1-5/1-10 y sí/no;
reorden con flechas, vista previa por tipo, selección de planteles
y niveles, configuración de estado, fechas y flag de anónima
- EvaluacionController: CRUD completo + toggleStatus
- Vistas: index, create/edit (con Livewire builder), show con detalle
de preguntas y cambio de estado
- Rutas resource /evaluacion + PATCH /evaluacion/{id}/status
- Migraciones: evaluaciones, preguntas, pregunta_opciones,
evaluacion_submissions, respuestas, evaluacion_plantel, evaluacion_nivel
- Menú: enlace Evaluaciones en panel de Administrador
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
@extends('layouts.landing')
|
||||
|
||||
@section('title', 'Evaluaciones')
|
||||
|
||||
@section('content')
|
||||
<div class="container-fluid">
|
||||
|
||||
@if(session('info'))
|
||||
<div class="alert alert-success alert-dismissible fade show" role="alert">
|
||||
{{ session('info') }}
|
||||
<button type="button" class="close" data-dismiss="alert"><span>×</span></button>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<div class="d-sm-flex align-items-center justify-content-between">
|
||||
<h6 class="m-0 font-weight-bold text-primary">
|
||||
<i class="fas fa-clipboard-list mr-1"></i> Evaluaciones
|
||||
</h6>
|
||||
<a href="{{ route('evaluacion.create') }}" class="btn btn-sm btn-primary shadow-sm">
|
||||
<i class="fas fa-plus fa-sm text-white-50"></i> Nueva evaluación
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
<th>Título</th>
|
||||
<th>Dirigida a</th>
|
||||
<th>Estado</th>
|
||||
<th class="text-center">Preguntas</th>
|
||||
<th class="text-center">Respuestas</th>
|
||||
<th>Vigencia</th>
|
||||
<th class="text-center">Acciones</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@forelse($evaluaciones as $evaluacion)
|
||||
<tr>
|
||||
<td>
|
||||
<strong>{{ $evaluacion->titulo }}</strong>
|
||||
@if($evaluacion->anonima)
|
||||
<span class="badge badge-secondary ml-1" title="Anónima">
|
||||
<i class="fas fa-user-secret"></i>
|
||||
</span>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
@php $slug = $evaluacion->tipo?->slug; @endphp
|
||||
@if($slug === 'docente')
|
||||
<span class="badge badge-info"><i class="fas fa-chalkboard-teacher mr-1"></i>Docentes</span>
|
||||
@elseif($slug === 'alumno')
|
||||
<span class="badge badge-success"><i class="fas fa-user-graduate mr-1"></i>Alumnos</span>
|
||||
@elseif($slug === 'administrativo')
|
||||
<span class="badge badge-warning text-dark"><i class="fas fa-briefcase mr-1"></i>Administrativos</span>
|
||||
@else
|
||||
<span class="badge badge-light">—</span>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
@if($evaluacion->status === 'activa')
|
||||
<span class="badge badge-success">Activa</span>
|
||||
@elseif($evaluacion->status === 'borrador')
|
||||
<span class="badge badge-secondary">Borrador</span>
|
||||
@else
|
||||
<span class="badge badge-dark">Cerrada</span>
|
||||
@endif
|
||||
</td>
|
||||
<td class="text-center">{{ $evaluacion->preguntas_count }}</td>
|
||||
<td class="text-center">{{ $evaluacion->submissions_count }}</td>
|
||||
<td>
|
||||
@if($evaluacion->fecha_inicio || $evaluacion->fecha_fin)
|
||||
<small>
|
||||
{{ $evaluacion->fecha_inicio?->format('d/m/Y') ?? '—' }}
|
||||
→
|
||||
{{ $evaluacion->fecha_fin?->format('d/m/Y') ?? '—' }}
|
||||
</small>
|
||||
@else
|
||||
<small class="text-muted">Sin fecha límite</small>
|
||||
@endif
|
||||
</td>
|
||||
<td class="text-center text-nowrap">
|
||||
<a href="{{ route('evaluacion.show', $evaluacion) }}"
|
||||
class="btn btn-sm btn-info" title="Ver detalle">
|
||||
<i class="fas fa-eye"></i>
|
||||
</a>
|
||||
<a href="{{ route('evaluacion.edit', $evaluacion) }}"
|
||||
class="btn btn-sm btn-primary" title="Editar">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<form action="{{ route('evaluacion.destroy', $evaluacion) }}"
|
||||
method="POST" class="d-inline"
|
||||
onsubmit="return confirm('¿Eliminar esta evaluación y todas sus preguntas?')">
|
||||
@csrf @method('DELETE')
|
||||
<button class="btn btn-sm btn-danger" title="Eliminar">
|
||||
<i class="fas fa-trash"></i>
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="7" class="text-center text-muted py-4">
|
||||
<i class="fas fa-clipboard fa-2x mb-2 d-block"></i>
|
||||
No hay evaluaciones registradas.
|
||||
</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
Reference in New Issue
Block a user