Resto de las vistas y plantillas del sistema

This commit is contained in:
Lucho
2026-06-24 16:21:44 -03:00
parent 7a622f469d
commit ff2fa9b70f
39 changed files with 6142 additions and 103 deletions
+32 -6
View File
@@ -12,8 +12,11 @@
<div class="col-12 col-sm-10 col-md-8 col-lg-5">
<div class="card shadow-sm border-0">
<div class="card-body p-4 p-md-5">
<h1 class="h4 mb-1">Login de Cliente</h1>
<p class="text-muted mb-4">Ingresa con tu correo y contraseña</p>
<h1 class="h4 mb-1 text-center">Login de Cliente</h1>
<div class="alert alert-info" role="alert">
Para iniciar sesión, primero debes ser cliente del estudio jurídico.
</div>
@if (session('login_error'))
<div class="alert alert-danger" role="alert">
@@ -27,6 +30,20 @@
</div>
@endif
@if($errors->any())
<div class="alert alert-danger" role="alert">
<ul class="mb-0 ps-3">
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<div class="alert alert-warning py-2" role="alert">
<strong>Intentos restantes:</strong> {{ $intentosRestantes ?? 5 }} de {{ $intentosMaximos ?? 5 }}
</div>
<form method="POST" action="/login/cliente" class="d-grid gap-3">
@csrf
<div>
@@ -39,19 +56,28 @@
<input class="form-control" id="contra" name="contra" type="password" required>
</div>
<div style="position:absolute; left:-9999px; width:1px; height:1px; overflow:hidden;" aria-hidden="true">
<label class="form-label" for="website">No completar este campo</label>
<input class="form-control" id="website" name="website" type="text" value="{{ old('website') }}" tabindex="-1" autocomplete="off">
</div>
<button class="btn btn-primary" type="submit">Ingresar</button>
</form>
<div class="text-center mt-3">
<a href="/cliente/recuperar-credenciales" class="small text-muted">¿Olvidó sus credenciales?</a>
</div>
<hr class="my-4">
<p class="mb-0 text-center">
¿Sos profesional o administrador?
<a href="/login/personal">Ir a login de personal</a>
</p>
<div class="d-grid">
<a href="/" class="btn btn-outline-secondary">Volver al inicio</a>
</div>
</div>
</div>
</div>
</div>
</main>
@include('partials.reportar-falla-boton')
</body>
</html>
+31 -12
View File
@@ -12,8 +12,7 @@
<div class="col-12 col-sm-10 col-md-8 col-lg-5">
<div class="card shadow-sm border-0">
<div class="card-body p-4 p-md-5">
<h1 class="h4 mb-1">Login de Personal</h1>
<p class="text-muted mb-4">Acceso para profesionales y administradores.</p>
<h1 class="h4 mb-1 text-center">Login de Personal</h1>
@if (session('login_error'))
<div class="alert alert-danger" role="alert">
@@ -27,6 +26,20 @@
</div>
@endif
@if($errors->any())
<div class="alert alert-danger" role="alert">
<ul class="mb-0 ps-3">
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<div class="alert alert-warning py-2" role="alert">
<strong>Intentos restantes:</strong> {{ $intentosRestantes ?? 5 }} de {{ $intentosMaximos ?? 5 }}
</div>
<form method="POST" action="/login/personal" class="d-grid gap-3">
@csrf
<div>
@@ -39,24 +52,30 @@
<input class="form-control" id="contra" name="contra" type="password" required>
</div>
<div style="position:absolute; left:-9999px; width:1px; height:1px; overflow:hidden;" aria-hidden="true">
<label class="form-label" for="website">No completar este campo</label>
<input class="form-control" id="website" name="website" type="text" value="{{ old('website') }}" tabindex="-1" autocomplete="off">
</div>
<button class="btn btn-primary" type="submit">Ingresar</button>
</form>
<div class="text-center mt-3">
<a href="/personal/recuperar-credenciales" class="small text-muted">Recuperacion para personal</a>
</div>
<div class="text-center mt-2">
<a href="/admin/recuperar-credenciales" class="small text-muted">Recuperación para administrador</a>
</div>
<hr class="my-4">
<p class="mb-0 text-center">
¿Sos cliente?
<a href="/login/cliente">Ir a login de cliente</a>
</p>
<div class="d-grid mt-3">
<a href="/" class="btn btn-outline-secondary">Volver al inicio</a>
</div>
</div>
</div>
</div>
</div>
<div class="text-center mt-4">
<a href="/" class="btn btn-secondary">Agregar Administrador</a>
</div>
<div class="text-center mt-2">
<a href="/" class="btn btn-secondary">Agregar Profesional</a>
</div>
</main>
@include('partials.reportar-falla-boton')
</body>
</html>
@@ -0,0 +1,55 @@
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Nuevas credenciales administrador</title>
@vite(['resources/css/app.css', 'resources/js/app.js'])
</head>
<body class="bg-light">
<main class="container py-5">
<div class="row justify-content-center">
<div class="col-12 col-sm-10 col-md-8 col-lg-5">
<div class="card shadow-sm border-0">
<div class="card-body p-4 p-md-5">
<h1 class="h4 mb-1 text-center">Nuevas credenciales administrador</h1>
<p class="text-muted text-center small mb-4">Ingresá tu nuevo usuario y tu nueva contraseña de administrador.</p>
@if($errors->any())
<div class="alert alert-danger" role="alert">
<ul class="mb-0 ps-3">
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form method="POST" action="/admin/recuperar-credenciales/{{ $token }}" class="d-grid gap-3">
@csrf
<div>
<label class="form-label" for="usuario">Nuevo usuario</label>
<input class="form-control" id="usuario" name="usuario" type="text" value="{{ old('usuario', $usuarioActual ?? '') }}" required autofocus autocomplete="username">
</div>
<div>
<label class="form-label" for="contra">Nueva contraseña</label>
<input class="form-control" id="contra" name="contra" type="password" required minlength="6" maxlength="30" autocomplete="new-password">
</div>
<div>
<label class="form-label" for="contra_confirmation">Confirmar contraseña</label>
<input class="form-control" id="contra_confirmation" name="contra_confirmation" type="password" required minlength="6" maxlength="30" autocomplete="new-password">
</div>
<button class="btn btn-primary" type="submit">Guardar credenciales</button>
</form>
<hr class="my-4">
<div class="d-grid">
<a href="/login/personal" class="btn btn-outline-secondary">Volver al login</a>
</div>
</div>
</div>
</div>
</div>
</main>
</body>
</html>
@@ -0,0 +1,51 @@
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Nueva contraseña personal</title>
@vite(['resources/css/app.css', 'resources/js/app.js'])
</head>
<body class="bg-light">
<main class="container py-5">
<div class="row justify-content-center">
<div class="col-12 col-sm-10 col-md-8 col-lg-5">
<div class="card shadow-sm border-0">
<div class="card-body p-4 p-md-5">
<h1 class="h4 mb-1 text-center">Nueva contraseña</h1>
<p class="text-muted text-center small mb-4">Ingresá tu nueva contraseña para el acceso de personal.</p>
@if($errors->any())
<div class="alert alert-danger" role="alert">
<ul class="mb-0 ps-3">
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form method="POST" action="/personal/recuperar-credenciales/{{ $token }}" class="d-grid gap-3">
@csrf
<div>
<label class="form-label" for="contra">Nueva contraseña</label>
<input class="form-control" id="contra" name="contra" type="password" required autofocus minlength="6" maxlength="30">
</div>
<div>
<label class="form-label" for="contra_confirmation">Confirmar contraseña</label>
<input class="form-control" id="contra_confirmation" name="contra_confirmation" type="password" required minlength="6" maxlength="30">
</div>
<button class="btn btn-primary" type="submit">Guardar contraseña</button>
</form>
<hr class="my-4">
<div class="d-grid">
<a href="/login/personal" class="btn btn-outline-secondary">Volver al login</a>
</div>
</div>
</div>
</div>
</div>
</main>
</body>
</html>
@@ -0,0 +1,51 @@
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Nueva contraseña</title>
@vite(['resources/css/app.css', 'resources/js/app.js'])
</head>
<body class="bg-light">
<main class="container py-5">
<div class="row justify-content-center">
<div class="col-12 col-sm-10 col-md-8 col-lg-5">
<div class="card shadow-sm border-0">
<div class="card-body p-4 p-md-5">
<h1 class="h4 mb-1 text-center">Nueva contraseña</h1>
<p class="text-muted text-center small mb-4">Ingresá tu nueva contraseña y confirmala para continuar.</p>
@if($errors->any())
<div class="alert alert-danger" role="alert">
<ul class="mb-0 ps-3">
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form method="POST" action="/cliente/recuperar-credenciales/{{ $token }}" class="d-grid gap-3">
@csrf
<div>
<label class="form-label" for="contra">Nueva contraseña</label>
<input class="form-control" id="contra" name="contra" type="password" required autofocus minlength="6" maxlength="30">
</div>
<div>
<label class="form-label" for="contra_confirmation">Confirmar contraseña</label>
<input class="form-control" id="contra_confirmation" name="contra_confirmation" type="password" required minlength="6" maxlength="30">
</div>
<button class="btn btn-primary" type="submit">Guardar contraseña</button>
</form>
<hr class="my-4">
<div class="d-grid">
<a href="/login/cliente" class="btn btn-outline-secondary">Volver al login</a>
</div>
</div>
</div>
</div>
</div>
</main>
</body>
</html>
@@ -0,0 +1,142 @@
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Recuperar credenciales administrador</title>
@vite(['resources/css/app.css', 'resources/js/app.js'])
</head>
<body class="bg-light">
<main class="container py-5">
<div class="row justify-content-center">
<div class="col-12 col-sm-10 col-md-8 col-lg-5">
<div class="card shadow-sm border-0">
<div class="card-body p-4 p-md-5">
<h1 class="h4 mb-1 text-center">Recuperar credenciales administrador</h1>
<p class="text-muted text-center small mb-4">Completá todos los datos con los que está registrado en el sistema</p>
@if(session('recuperar_success'))
<div class="alert alert-success" role="alert">
{{ session('recuperar_success') }}
</div>
@endif
@if(session('recuperar_error'))
<div class="alert alert-danger" role="alert">
{{ session('recuperar_error') }}
</div>
@endif
@if($errors->any())
<div class="alert alert-danger" role="alert">
<ul class="mb-0 ps-3">
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<div class="alert alert-warning py-2" role="alert">
<strong>Intentos restantes:</strong> {{ $intentosRestantes ?? 5 }} de {{ $intentosMaximos ?? 5 }}
</div>
<form method="POST" action="/admin/recuperar-credenciales" class="d-grid gap-3">
@csrf
<div>
<label class="form-label" for="celular">Número de celular</label>
<input class="form-control" id="celular" name="celular" type="text" value="{{ old('celular') }}" required autofocus>
</div>
<div>
<label class="form-label" for="nombre">Nombre</label>
<input class="form-control" id="nombre" name="nombre" type="text" value="{{ old('nombre') }}" required>
</div>
<div>
<label class="form-label" for="apellido">Apellido</label>
<input class="form-control" id="apellido" name="apellido" type="text" value="{{ old('apellido') }}" required>
</div>
<div>
<label class="form-label" for="correo">Correo electrónico</label>
<input class="form-control" id="correo" name="correo" type="email" value="{{ old('correo') }}" required>
</div>
<div>
<label class="form-label" for="pregunta_secreta">Pregunta secreta</label>
<input class="form-control" id="pregunta_secreta" name="pregunta_secreta" type="text" value="{{ old('pregunta_secreta') }}" placeholder="Ingresá el correo para visualizar la pregunta" readonly>
<div id="pregunta-secreta-ayuda" class="form-text">La pregunta se mostrará automáticamente según el correo ingresado.</div>
</div>
<div>
<label class="form-label" for="respuesta_secreta">Respuesta secreta</label>
<input class="form-control" id="respuesta_secreta" name="respuesta_secreta" type="text" value="{{ old('respuesta_secreta') }}" required>
</div>
<div style="position:absolute; left:-9999px; width:1px; height:1px; overflow:hidden;" aria-hidden="true">
<label class="form-label" for="website">No completar este campo</label>
<input class="form-control" id="website" name="website" type="text" value="{{ old('website') }}" tabindex="-1" autocomplete="off">
</div>
<button class="btn btn-primary" type="submit">Enviar enlace</button>
</form>
<hr class="my-4">
<div class="d-grid">
<a href="/login/personal" class="btn btn-outline-secondary">Volver al login</a>
</div>
</div>
</div>
</div>
</div>
</main>
<script>
document.addEventListener('DOMContentLoaded', function () {
const correoInput = document.getElementById('correo');
const preguntaInput = document.getElementById('pregunta_secreta');
const ayuda = document.getElementById('pregunta-secreta-ayuda');
if (!correoInput || !preguntaInput || !ayuda) {
return;
}
const limpiarPregunta = (mensaje = 'La pregunta se mostrará automáticamente según el correo ingresado.') => {
preguntaInput.value = '';
ayuda.textContent = mensaje;
};
const cargarPregunta = async () => {
const correo = correoInput.value.trim();
if (correo === '') {
limpiarPregunta();
return;
}
ayuda.textContent = 'Buscando pregunta secreta...';
try {
const response = await fetch('/admin/recuperar-credenciales/pregunta?correo=' + encodeURIComponent(correo), {
headers: {
'X-Requested-With': 'XMLHttpRequest'
}
});
const data = await response.json();
if (data.encontrada && data.pregunta) {
preguntaInput.value = data.pregunta;
ayuda.textContent = 'Respondé la pregunta secreta para continuar.';
} else {
limpiarPregunta('No se encontró una pregunta secreta visible para ese correo.');
}
} catch (error) {
limpiarPregunta('No se pudo cargar la pregunta secreta. Intentá nuevamente.');
}
};
correoInput.addEventListener('blur', cargarPregunta);
correoInput.addEventListener('change', cargarPregunta);
if (correoInput.value.trim() !== '') {
cargarPregunta();
}
});
</script>
</body>
</html>
@@ -0,0 +1,84 @@
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Recuperar credenciales personal</title>
@vite(['resources/css/app.css', 'resources/js/app.js'])
</head>
<body class="bg-light">
<main class="container py-5">
<div class="row justify-content-center">
<div class="col-12 col-sm-10 col-md-8 col-lg-5">
<div class="card shadow-sm border-0">
<div class="card-body p-4 p-md-5">
<h1 class="h4 mb-1 text-center">Recuperar credenciales</h1>
<p class="text-muted text-center small mb-4">Ingresá los datos con los que estás registrado en el sistema para recibir el enlace de recuperación.</p>
@if(session('recuperar_success'))
<div class="alert alert-success" role="alert">
{{ session('recuperar_success') }}
</div>
@endif
@if(session('recuperar_error'))
<div class="alert alert-danger" role="alert">
{{ session('recuperar_error') }}
</div>
@endif
@if($errors->any())
<div class="alert alert-danger" role="alert">
<ul class="mb-0 ps-3">
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<div class="alert alert-warning py-2" role="alert">
<strong>Intentos restantes:</strong> {{ $intentosRestantes ?? 5 }} de {{ $intentosMaximos ?? 5 }}
</div>
<form method="POST" action="/personal/recuperar-credenciales" class="d-grid gap-3">
@csrf
<div>
<label class="form-label" for="dni">DNI</label>
<input class="form-control" id="dni" name="dni" type="text" value="{{ old('dni') }}" required autofocus>
</div>
<div>
<label class="form-label" for="matricula">Matrícula</label>
<input class="form-control" id="matricula" name="matricula" type="text" value="{{ old('matricula') }}" required>
</div>
<div>
<label class="form-label" for="profesion_id">Profesión</label>
<select class="form-select" id="profesion_id" name="profesion_id" required>
<option value="">Seleccionar profesión</option>
@foreach(($profesiones ?? []) as $profesion)
<option value="{{ $profesion->id }}" @selected((string) old('profesion_id') === (string) $profesion->id)>{{ $profesion->titulo }}</option>
@endforeach
</select>
</div>
<div>
<label class="form-label" for="correo">Correo electrónico</label>
<input class="form-control" id="correo" name="correo" type="email" value="{{ old('correo') }}" required>
</div>
<div style="position:absolute; left:-9999px; width:1px; height:1px; overflow:hidden;" aria-hidden="true">
<label class="form-label" for="website">No completar este campo</label>
<input class="form-control" id="website" name="website" type="text" value="{{ old('website') }}" tabindex="-1" autocomplete="off">
</div>
<button class="btn btn-primary" type="submit">Enviar enlace</button>
</form>
<hr class="my-4">
<div class="d-grid">
<a href="/login/personal" class="btn btn-outline-secondary">Volver al login</a>
</div>
</div>
</div>
</div>
</div>
</main>
</body>
</html>
@@ -0,0 +1,71 @@
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Recuperar credenciales</title>
@vite(['resources/css/app.css', 'resources/js/app.js'])
</head>
<body class="bg-light">
<main class="container py-5">
<div class="row justify-content-center">
<div class="col-12 col-sm-10 col-md-8 col-lg-5">
<div class="card shadow-sm border-0">
<div class="card-body p-4 p-md-5">
<h1 class="h4 mb-1 text-center">Recuperar credenciales</h1>
<p class="text-muted text-center small mb-4">Ingresá tu correo electrónico y te enviaremos un enlace para restablecer tu contraseña.</p>
@if(session('recuperar_success'))
<div class="alert alert-success" role="alert">
{{ session('recuperar_success') }}
</div>
@endif
@if(session('recuperar_error'))
<div class="alert alert-danger" role="alert">
{{ session('recuperar_error') }}
</div>
@endif
@if($errors->any())
<div class="alert alert-danger" role="alert">
<ul class="mb-0 ps-3">
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<div class="alert alert-warning py-2" role="alert">
<strong>Intentos restantes:</strong> {{ $intentosRestantes ?? 5 }} de {{ $intentosMaximos ?? 5 }}
</div>
<form method="POST" action="/cliente/recuperar-credenciales" class="d-grid gap-3">
@csrf
<div>
<label class="form-label" for="correo">Correo electrónico con el que está registrado</label>
<input class="form-control" id="correo" name="correo" type="email" value="{{ old('correo') }}" required autofocus>
</div>
<div style="position:absolute; left:-9999px; width:1px; height:1px; overflow:hidden;" aria-hidden="true">
<label class="form-label" for="website">No completar este campo</label>
<input class="form-control" id="website" name="website" type="text" value="{{ old('website') }}" tabindex="-1" autocomplete="off">
</div>
<button class="btn btn-primary" type="submit">Enviar enlace</button>
</form>
<div class="alert alert-info mt-3 mb-0" role="alert">
Si no recibis el correo en los proximos 5 minutos o tenes otro problema, comunicate algun profesional de Abogadas del Litoral.
</div>
<hr class="my-4">
<div class="d-grid">
<a href="/login/cliente" class="btn btn-outline-secondary">Volver al login</a>
</div>
</div>
</div>
</div>
</div>
</main>
</body>
</html>