Modificación del userController para el cambnio de rol si es alumno o docente
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
{{--
|
||||
Variables esperadas:
|
||||
$pregunta - Pregunta model
|
||||
$tipoSlug - string (slug del tipo)
|
||||
$fieldName - string (name del input, ej: "resp[1]" o "resp[1][5]")
|
||||
$fieldId - string (id único del input)
|
||||
--}}
|
||||
|
||||
@if($tipoSlug === 'texto_libre')
|
||||
<textarea name="{{ $fieldName }}"
|
||||
id="{{ $fieldId }}"
|
||||
class="form-control"
|
||||
rows="4"
|
||||
placeholder="Escribe tu respuesta aquí…"
|
||||
{{ $pregunta->requerida ? 'required' : '' }}></textarea>
|
||||
|
||||
@elseif($tipoSlug === 'opcion_multiple')
|
||||
<div>
|
||||
@foreach($pregunta->opciones as $opcion)
|
||||
<div class="form-check mb-2">
|
||||
<input type="radio"
|
||||
name="{{ $fieldName }}"
|
||||
id="{{ $fieldId }}_{{ $opcion->id }}"
|
||||
value="{{ $opcion->id }}"
|
||||
class="form-check-input"
|
||||
{{ $pregunta->requerida ? 'required' : '' }}>
|
||||
<label class="form-check-label" for="{{ $fieldId }}_{{ $opcion->id }}">
|
||||
{{ $opcion->texto }}
|
||||
</label>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
@elseif($tipoSlug === 'si_no')
|
||||
<div class="d-flex">
|
||||
<div class="form-check mr-4">
|
||||
<input type="radio"
|
||||
name="{{ $fieldName }}"
|
||||
id="{{ $fieldId }}_si"
|
||||
value="si"
|
||||
class="form-check-input"
|
||||
{{ $pregunta->requerida ? 'required' : '' }}>
|
||||
<label class="form-check-label font-weight-bold text-success" for="{{ $fieldId }}_si">
|
||||
Sí
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input type="radio"
|
||||
name="{{ $fieldName }}"
|
||||
id="{{ $fieldId }}_no"
|
||||
value="no"
|
||||
class="form-check-input"
|
||||
{{ $pregunta->requerida ? 'required' : '' }}>
|
||||
<label class="form-check-label font-weight-bold text-danger" for="{{ $fieldId }}_no">
|
||||
No
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@elseif($tipoSlug === 'escala_5')
|
||||
<div class="d-flex flex-wrap" style="gap:.5rem;">
|
||||
@for($k = 1; $k <= 5; $k++)
|
||||
<div class="form-check form-check-inline mr-0">
|
||||
<input type="radio"
|
||||
name="{{ $fieldName }}"
|
||||
id="{{ $fieldId }}_{{ $k }}"
|
||||
value="{{ $k }}"
|
||||
class="form-check-input d-none escala-input"
|
||||
{{ $pregunta->requerida ? 'required' : '' }}>
|
||||
<label class="btn btn-outline-primary px-3 py-2"
|
||||
for="{{ $fieldId }}_{{ $k }}">{{ $k }}</label>
|
||||
</div>
|
||||
@endfor
|
||||
<small class="text-muted align-self-center ml-2">1 = Muy malo 5 = Excelente</small>
|
||||
</div>
|
||||
|
||||
@elseif($tipoSlug === 'escala_10')
|
||||
<div class="d-flex flex-wrap" style="gap:.5rem;">
|
||||
@for($k = 1; $k <= 10; $k++)
|
||||
<div class="form-check form-check-inline mr-0">
|
||||
<input type="radio"
|
||||
name="{{ $fieldName }}"
|
||||
id="{{ $fieldId }}_{{ $k }}"
|
||||
value="{{ $k }}"
|
||||
class="form-check-input d-none escala-input"
|
||||
{{ $pregunta->requerida ? 'required' : '' }}>
|
||||
<label class="btn btn-outline-primary px-3 py-2"
|
||||
for="{{ $fieldId }}_{{ $k }}">{{ $k }}</label>
|
||||
</div>
|
||||
@endfor
|
||||
<small class="text-muted align-self-center ml-2">1 = Muy malo 10 = Excelente</small>
|
||||
</div>
|
||||
@endif
|
||||
@@ -16,7 +16,7 @@
|
||||
<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
|
||||
<i class="fa-duotone fa-regular fa-clipboard-list"></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
|
||||
@@ -25,8 +25,7 @@
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
<table id="tcont" class="table table-striped table-bordered nowrap table-hover" style="width:100%;">
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
<th>Título</th>
|
||||
@@ -52,11 +51,11 @@
|
||||
<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>
|
||||
<span class="badge badge-info"><i class="fa-duotone fa-solid fa-chalkboard-user"></i> Docentes</span>
|
||||
@elseif($slug === 'alumno')
|
||||
<span class="badge badge-success"><i class="fas fa-user-graduate mr-1"></i>Alumnos</span>
|
||||
<span class="badge badge-success"><i class="fa-duotone fa-solid fa-user-graduate"></i> Alumnos</span>
|
||||
@elseif($slug === 'administrativo')
|
||||
<span class="badge badge-warning text-dark"><i class="fas fa-briefcase mr-1"></i>Administrativos</span>
|
||||
<span class="badge badge-warning text-dark"><i class="fa-duotone fa-regular fa-briefcase"></i> Administrativos</span>
|
||||
@else
|
||||
<span class="badge badge-light">—</span>
|
||||
@endif
|
||||
@@ -86,34 +85,32 @@
|
||||
<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>
|
||||
<i class="fa-duotone fa-solid fa-eye"></i>
|
||||
</a>
|
||||
<a href="{{ route('evaluacion.edit', $evaluacion) }}"
|
||||
class="btn btn-sm btn-primary" title="Editar">
|
||||
<i class="fas fa-edit"></i>
|
||||
<i class="fa-duotone fa-solid fa-pen-to-square"></i>
|
||||
</a>
|
||||
<form action="{{ route('evaluacion.destroy', $evaluacion) }}"
|
||||
method="POST" class="d-inline"
|
||||
onsubmit="return confirm('¿Eliminar esta evaluación y todas sus preguntas?')">
|
||||
method="POST" class="d-inline delete-form">
|
||||
@csrf @method('DELETE')
|
||||
<button class="btn btn-sm btn-danger" title="Eliminar">
|
||||
<i class="fas fa-trash"></i>
|
||||
<i class="fa-duotone fa-solid fa-trash-can"></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
|
||||
|
||||
|
||||
@section('scripts')
|
||||
@include('layouts._partials.tablaScript')
|
||||
@include('layouts._partials.delete')
|
||||
@endsection
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
@extends('layouts.landing')
|
||||
|
||||
@section('title', 'Mis Evaluaciones')
|
||||
|
||||
@section('content')
|
||||
<div class="container-fluid">
|
||||
|
||||
@if(session('info'))
|
||||
<div class="alert alert-success alert-dismissible fade show">
|
||||
<i class="fas fa-check-circle mr-1"></i> {{ 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">
|
||||
<h6 class="m-0 font-weight-bold text-primary">
|
||||
<i class="fas fa-clipboard-check mr-1"></i> Mis Evaluaciones
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
|
||||
@if(!$docente && !$alumno)
|
||||
<div class="alert alert-warning">
|
||||
Tu cuenta no está vinculada a un docente o alumno. Contacta al administrador.
|
||||
</div>
|
||||
|
||||
@elseif($evaluaciones->isEmpty())
|
||||
<div class="alert alert-info">
|
||||
<i class="fas fa-info-circle mr-1"></i>
|
||||
No tienes evaluaciones activas en este momento.
|
||||
</div>
|
||||
|
||||
@else
|
||||
<div class="row">
|
||||
@foreach($evaluaciones as $evaluacion)
|
||||
@php $yaRespondida = in_array($evaluacion->id, $respondidas); @endphp
|
||||
<div class="col-md-6 col-lg-4 mb-4">
|
||||
<div class="card h-100 shadow-sm
|
||||
{{ $yaRespondida ? 'border-success' : 'border-primary' }}">
|
||||
<div class="card-header py-2 d-flex align-items-center justify-content-between
|
||||
{{ $yaRespondida ? 'bg-success text-white' : 'bg-primary text-white' }}">
|
||||
<small class="font-weight-bold">
|
||||
@if($yaRespondida)
|
||||
<i class="fas fa-check-circle mr-1"></i> Respondida
|
||||
@else
|
||||
<i class="fas fa-clipboard-list mr-1"></i> Pendiente
|
||||
@endif
|
||||
</small>
|
||||
<span class="badge badge-light text-dark">
|
||||
{{ $evaluacion->preguntas_count }} preguntas
|
||||
</span>
|
||||
</div>
|
||||
<div class="card-body d-flex flex-column">
|
||||
<h6 class="font-weight-bold mb-1">{{ $evaluacion->titulo }}</h6>
|
||||
|
||||
@if($evaluacion->descripcion)
|
||||
<p class="text-muted small mb-2">
|
||||
{{ Str::limit($evaluacion->descripcion, 120) }}
|
||||
</p>
|
||||
@endif
|
||||
|
||||
<div class="mt-auto">
|
||||
@if($evaluacion->fecha_inicio || $evaluacion->fecha_fin)
|
||||
<small class="text-muted d-block mb-2">
|
||||
<i class="fas fa-calendar-alt mr-1"></i>
|
||||
{{ $evaluacion->fecha_inicio
|
||||
? \Carbon\Carbon::parse($evaluacion->fecha_inicio)->format('d/m/Y')
|
||||
: 'Sin inicio' }}
|
||||
—
|
||||
{{ $evaluacion->fecha_fin
|
||||
? \Carbon\Carbon::parse($evaluacion->fecha_fin)->format('d/m/Y')
|
||||
: 'Sin límite' }}
|
||||
</small>
|
||||
@endif
|
||||
|
||||
@if($yaRespondida)
|
||||
<button class="btn btn-success btn-sm btn-block" disabled>
|
||||
<i class="fas fa-check mr-1"></i> Ya respondida
|
||||
</button>
|
||||
@else
|
||||
<a href="{{ route('evaluacion.responder.show', $evaluacion) }}"
|
||||
class="btn btn-primary btn-sm btn-block">
|
||||
<i class="fas fa-pencil-alt mr-1"></i> Responder evaluación
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
@@ -0,0 +1,151 @@
|
||||
@extends('layouts.landing')
|
||||
|
||||
@section('title', $evaluacion->titulo)
|
||||
|
||||
@section('content')
|
||||
<div class="container-fluid">
|
||||
|
||||
<div class="d-sm-flex align-items-center justify-content-between mb-3">
|
||||
<div>
|
||||
<h5 class="m-0 font-weight-bold text-primary">
|
||||
<i class="fas fa-clipboard-list mr-1"></i> {{ $evaluacion->titulo }}
|
||||
</h5>
|
||||
@if($evaluacion->descripcion)
|
||||
<small class="text-muted">{{ $evaluacion->descripcion }}</small>
|
||||
@endif
|
||||
</div>
|
||||
<a href="{{ route('evaluacion.mis_evaluaciones') }}" class="btn btn-sm btn-secondary mt-2 mt-sm-0">
|
||||
<i class="fas fa-arrow-left mr-1"></i> Regresar
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@if(session('error'))
|
||||
<div class="alert alert-danger">{{ session('error') }}</div>
|
||||
@endif
|
||||
|
||||
@if($yaRespondida)
|
||||
{{-- Ya respondida --}}
|
||||
<div class="card shadow">
|
||||
<div class="card-body text-center py-5">
|
||||
<i class="fas fa-check-circle fa-4x text-success mb-3 d-block"></i>
|
||||
<h5 class="font-weight-bold">Ya respondiste esta evaluación</h5>
|
||||
<p class="text-muted">Tu participación ha sido registrada. ¡Gracias!</p>
|
||||
<a href="{{ route('evaluacion.mis_evaluaciones') }}" class="btn btn-primary">
|
||||
<i class="fas fa-arrow-left mr-1"></i> Volver a mis evaluaciones
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@else
|
||||
{{-- Formulario --}}
|
||||
<form action="{{ route('evaluacion.responder.store', $evaluacion) }}" method="POST"
|
||||
id="form-evaluacion">
|
||||
@csrf
|
||||
|
||||
@php
|
||||
$numPregunta = 1;
|
||||
$totalPreguntas = $preguntas->count();
|
||||
// For docente questions: multiply by number of teachers
|
||||
if($docentesParaEvaluar->isNotEmpty()) {
|
||||
$esDocenteCount = $preguntas->where('es_docente', true)->count();
|
||||
$normalCount = $totalPreguntas - $esDocenteCount;
|
||||
$totalPreguntas = $normalCount + ($esDocenteCount * $docentesParaEvaluar->count());
|
||||
}
|
||||
@endphp
|
||||
|
||||
{{-- Info de la evaluación --}}
|
||||
<div class="alert alert-info d-flex align-items-center mb-4">
|
||||
<i class="fas fa-info-circle fa-lg mr-3"></i>
|
||||
<div>
|
||||
<strong>{{ $totalPreguntas }} pregunta(s)</strong> en esta evaluación.
|
||||
@if($evaluacion->anonima)
|
||||
<span class="badge badge-secondary">
|
||||
<i class="fas fa-user-secret mr-1"></i>Anónima
|
||||
</span>
|
||||
@endif
|
||||
@if($evaluacion->fecha_fin)
|
||||
Cierra el
|
||||
<strong>{{ \Carbon\Carbon::parse($evaluacion->fecha_fin)->format('d/m/Y') }}</strong>.
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@foreach($preguntas as $pregunta)
|
||||
@php $tipoSlug = $pregunta->tipo?->slug; @endphp
|
||||
|
||||
@if($pregunta->es_docente && $docentesParaEvaluar->isNotEmpty())
|
||||
{{-- ═══ PREGUNTA DE DOCENTE: una vez por cada docente ═══ --}}
|
||||
@foreach($docentesParaEvaluar as $docente)
|
||||
@php
|
||||
$user = $docente->docentes->first();
|
||||
$fotoUrl = $user?->profile_photo_url;
|
||||
$nombreDocente = $user?->name ?? 'Docente';
|
||||
@endphp
|
||||
|
||||
<div class="card shadow-sm mb-4 border-left-info">
|
||||
<div class="card-header py-2 bg-light d-flex align-items-center">
|
||||
{{-- Foto del docente --}}
|
||||
<img src="{{ $fotoUrl }}"
|
||||
alt="{{ $nombreDocente }}"
|
||||
class="rounded-circle mr-3"
|
||||
style="width:48px; height:48px; object-fit:cover; border:2px solid #36b9cc;">
|
||||
<div>
|
||||
<div class="font-weight-bold">{{ $nombreDocente }}</div>
|
||||
<small class="text-muted">
|
||||
<i class="fas fa-chalkboard-teacher mr-1 text-info"></i>
|
||||
Pregunta {{ $numPregunta++ }}
|
||||
@if($pregunta->requerida)
|
||||
<span class="text-danger">*</span>
|
||||
@endif
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p class="font-weight-bold mb-3">{{ $pregunta->texto }}</p>
|
||||
|
||||
@include('evaluacion._input_pregunta', [
|
||||
'pregunta' => $pregunta,
|
||||
'tipoSlug' => $tipoSlug,
|
||||
'fieldName' => "resp[{$pregunta->id}][{$docente->id}]",
|
||||
'fieldId' => "resp_{$pregunta->id}_{$docente->id}",
|
||||
])
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
|
||||
@else
|
||||
{{-- ═══ PREGUNTA NORMAL ═══ --}}
|
||||
<div class="card shadow-sm mb-4 border-left-primary">
|
||||
<div class="card-body">
|
||||
<small class="text-muted font-weight-bold d-block mb-1">
|
||||
Pregunta {{ $numPregunta++ }}
|
||||
@if($pregunta->requerida)
|
||||
<span class="text-danger">*</span>
|
||||
@endif
|
||||
</small>
|
||||
<p class="font-weight-bold mb-3">{{ $pregunta->texto }}</p>
|
||||
|
||||
@include('evaluacion._input_pregunta', [
|
||||
'pregunta' => $pregunta,
|
||||
'tipoSlug' => $tipoSlug,
|
||||
'fieldName' => "resp[{$pregunta->id}]",
|
||||
'fieldId' => "resp_{$pregunta->id}",
|
||||
])
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
@endforeach
|
||||
|
||||
<div class="card shadow-sm mb-4">
|
||||
<div class="card-body text-center">
|
||||
<button type="submit" class="btn btn-success btn-lg px-5"
|
||||
onclick="return confirm('¿Estás seguro de enviar la evaluación? No podrás cambiar tus respuestas.')">
|
||||
<i class="fas fa-paper-plane mr-2"></i> Enviar evaluación
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
@endsection
|
||||
@@ -150,12 +150,19 @@
|
||||
<div class="card-body py-2 px-3">
|
||||
<div class="d-flex justify-content-between align-items-start">
|
||||
<div class="flex-grow-1">
|
||||
<small class="text-muted font-weight-bold d-block mb-1">
|
||||
Pregunta {{ $i + 1 }}
|
||||
@if($pregunta->requerida)
|
||||
<span class="text-danger">*</span>
|
||||
<div class="d-flex align-items-center mb-1 flex-wrap" style="gap:.3rem;">
|
||||
<small class="text-muted font-weight-bold">
|
||||
Pregunta {{ $i + 1 }}
|
||||
@if($pregunta->requerida)
|
||||
<span class="text-danger">*</span>
|
||||
@endif
|
||||
</small>
|
||||
@if($pregunta->es_docente)
|
||||
<span class="badge badge-info">
|
||||
<i class="fas fa-chalkboard-teacher mr-1"></i>Por docente
|
||||
</span>
|
||||
@endif
|
||||
</small>
|
||||
</div>
|
||||
<p class="mb-1 font-weight-bold">{{ $pregunta->texto }}</p>
|
||||
<small class="text-muted">{{ $pregunta->tipo?->nombre }}</small>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user