Modificación del userController para el cambnio de rol si es alumno o docente

This commit is contained in:
2026-05-05 18:33:36 -06:00
parent 59b7ff87f3
commit 91d0813a9c
21 changed files with 1267 additions and 165 deletions
@@ -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">
</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 &nbsp; 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 &nbsp; 10 = Excelente</small>
</div>
@endif
+15 -18
View File
@@ -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>&times;</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)
&nbsp;<span class="badge badge-secondary">
<i class="fas fa-user-secret mr-1"></i>Anónima
</span>
@endif
@if($evaluacion->fecha_fin)
&nbsp; 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
+12 -5
View File
@@ -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>