F2 avanzada
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
@model List<vita_asistente.Data.Models.Paciente>
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "Pacientes";
|
||||
Layout = "_Layout";
|
||||
}
|
||||
|
||||
<div class="container mt-4">
|
||||
<h2>Lista de Pacientes</h2>
|
||||
|
||||
@if (User.IsInRole("Admin"))
|
||||
{
|
||||
<a asp-action="Create" class="btn btn-success mb-3">Nuevo Paciente</a>
|
||||
}
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<form asp-action="Index" method="get" class="row g-3 mb-4">
|
||||
<div class="col-md-5">
|
||||
<label for="nombreBusqueda" class="form-label">Nombre o Documento</label>
|
||||
<input type="text" class="form-control" id="nombreBusqueda" name="nombreBusqueda"
|
||||
placeholder="Buscar por nombre o documento..." value="@ViewBag.NombreBusqueda">
|
||||
</div>
|
||||
<div class="col-md-2 d-flex align-items-end">
|
||||
<button type="submit" class="btn btn-primary me-3">Buscar</button>
|
||||
@if (!string.IsNullOrEmpty(ViewBag.NombreBusqueda))
|
||||
{
|
||||
<a asp-action="Index" class="btn btn-outline-secondary">Limpiar</a>
|
||||
}
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<table class="table table-striped">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th>Documento</th>
|
||||
<th>Nombre Completo</th>
|
||||
<th>Email</th>
|
||||
<th>Fecha Registro</th>
|
||||
<th>Estado</th>
|
||||
<th>Acciones</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var paciente in Model)
|
||||
{
|
||||
<tr>
|
||||
<td>@Html.DisplayFor(modelItem => paciente.Documento)</td>
|
||||
<td>@Html.DisplayFor(modelItem => paciente.Nombre) @Html.DisplayFor(modelItem => paciente.Apellido)</td>
|
||||
<td>@Html.DisplayFor(modelItem => paciente.Email)</td>
|
||||
<td>@Html.DisplayFor(modelItem => paciente.FechaRegistro.ToShortDateString())</td>
|
||||
<td>
|
||||
@if (paciente.IsActive)
|
||||
{
|
||||
<span class="badge bg-success">Activo</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span class="badge bg-danger">Inactivo</span>
|
||||
}
|
||||
</td>
|
||||
<td>
|
||||
@if (User.IsInRole("Admin") || (User.Identity != null && User.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier")?.Value == paciente.Id))
|
||||
{
|
||||
<a asp-action="Details" asp-route-id="@paciente.Id" class="btn btn-sm btn-info">Ver</a>
|
||||
@if (User.IsInRole("Admin"))
|
||||
{
|
||||
<a asp-action="Edit" asp-route-id="@paciente.Id" class="btn btn-sm btn-warning ms-1">Editar</a>
|
||||
@if (!paciente.IsActive)
|
||||
{
|
||||
<form asp-action="Activate" asp-route-id="@paciente.Id" class="d-inline">
|
||||
<button type="submit" class="btn btn-sm btn-success ms-1" onclick="return confirm('¿Activar este paciente?');">Activar</button>
|
||||
</form>
|
||||
}
|
||||
else
|
||||
{
|
||||
<a asp-action="Delete" asp-route-id="@paciente.Id" class="btn btn-sm btn-danger ms-1">Desactivar</a>
|
||||
}
|
||||
}
|
||||
}
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,3 +1,4 @@
|
||||
@using Microsoft.AspNetCore.Identity
|
||||
@model IdentityRole
|
||||
|
||||
@{
|
||||
@@ -8,6 +9,23 @@
|
||||
|
||||
<p>¿Está seguro que desea deshabilitar este rol? Esto afectará a los usuarios con este rol.</p>
|
||||
|
||||
<form asp-action="DisableConfirmed" method="post">
|
||||
<input type="hidden" name="id" value="@Model.Id" />
|
||||
@Html.AntiForgeryToken()
|
||||
<div class="form-group">
|
||||
<button type="submit" class="btn btn-warning">Deshabilitar rol</button>
|
||||
<a asp-action="Index" class="btn btn-secondary">Cancelar</a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "Deshabilitar rol";
|
||||
}
|
||||
|
||||
<h1>Deshabilitar rol: @Model.Name</h1>
|
||||
|
||||
<p>¿Está seguro que desea deshabilitar este rol? Esto afectará a los usuarios con este rol.</p>
|
||||
|
||||
<form asp-action="DisableConfirmed" method="post">
|
||||
<input type="hidden" name="id" value="@Model.Id" />
|
||||
@Html.AntiForgeryToken()
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
@using Microsoft.AspNetCore.Identity
|
||||
@model IdentityRole
|
||||
|
||||
@{
|
||||
@@ -19,6 +20,29 @@
|
||||
</div>
|
||||
</form>
|
||||
|
||||
section scripts {
|
||||
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
|
||||
}
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "Editar rol";
|
||||
}
|
||||
|
||||
<h1>Editar rol: @Model.Name</h1>
|
||||
|
||||
<form asp-action="Edit">
|
||||
<input type="hidden" asp-for="Id" />
|
||||
<div class="form-group">
|
||||
<label asp-for="Name" class="control-label"></label>
|
||||
<input asp-for="Name" class="form-control" />
|
||||
<span asp-validation-for="Name" class="text-danger"></span>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<input type="submit" value="Guardar cambios" class="btn btn-primary" />
|
||||
<a asp-action="Index" class="btn btn-secondary">Cancelar</a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
section scripts {
|
||||
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
|
||||
}
|
||||
@@ -2,7 +2,30 @@
|
||||
@model IEnumerable<IdentityRole>
|
||||
|
||||
<h1>Roles</h1>
|
||||
<p><a asp-action="Create" class="btn btn-primary">Crear nuevo rol</a></p>
|
||||
|
||||
<!-- Modal de creación -->
|
||||
<div class="modal fade" id="createModal" tabindex="-1" aria-labelledby="createModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<form asp-action="Create" method="post">
|
||||
@Html.AntiForgeryToken()
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="createModalLabel">Crear nuevo rol</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<input name="roleName" class="form-control" placeholder="Nombre del rol" required />
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
|
||||
<button type="submit" class="btn btn-primary">Guardar cambios</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p><a href="#" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#createModal">Crear nuevo rol</a></p>
|
||||
<table class="table">
|
||||
<thead><tr><th>Nombre</th><th>Acciones</th></tr></thead>
|
||||
<tbody>
|
||||
@@ -13,19 +36,19 @@
|
||||
<td>
|
||||
<a href="#" class="btn btn-info btn-sm" data-bs-toggle="modal" data-bs-target="#editModal-@role.Id">Editar</a>
|
||||
|
||||
<!-- Modal de edición -->
|
||||
<!-- Modal de edición -->
|
||||
<div class="modal fade" id="editModal-@role.Id" tabindex="-1" aria-labelledby="editModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<form asp-action="Edit" method="post">
|
||||
<input type="hidden" name="id" value="@role.Id" />
|
||||
@HttpContext.RequestServices.GetService typeof(Antiforgery.IAntiforgery)
|
||||
@Html.AntiForgeryToken()
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="editModalLabel">Editar rol: @role.Name</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<input asp-for="Name" class="form-control" placeholder="Nuevo nombre del rol" />
|
||||
<input name="Name" value="@role.Name" class="form-control" placeholder="Nuevo nombre del rol" />
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button>
|
||||
|
||||
+52
-58
@@ -1,5 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
@{
|
||||
var controller = ViewContext.RouteData.Values["controller"]?.ToString();
|
||||
}
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="es">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
@@ -9,67 +13,57 @@
|
||||
<link rel="stylesheet" href="~/vita_asistente.styles.css" asp-append-version="true" />
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">vita_asistente</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
|
||||
aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
|
||||
@if (User.IsInRole("Admin"))
|
||||
{
|
||||
<li class="nav-item dropdown">
|
||||
<a class="nav-link dropdown-toggle" href="#" id="adminDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
Administración
|
||||
</a>
|
||||
<ul class="dropdown-menu" aria-labelledby="adminDropdown">
|
||||
<li><a class="dropdown-item" asp-controller="Usuarios" asp-action="Index">Usuarios</a></li>
|
||||
<li><a class="dropdown-item" asp-controller="Roles" asp-action="Index">Roles</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
}
|
||||
<ul class="navbar-nav ms-auto">
|
||||
@if (User.Identity.IsAuthenticated)
|
||||
{
|
||||
<li class="nav-item">
|
||||
<span class="navbar-text">Hola, @User.Identity.Name!</span>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<form asp-controller="Account" asp-action="Logout" method="post" class="form-inline">
|
||||
<button type="submit" class="nav-link btn btn-link text-dark">Cerrar sesión</button>
|
||||
</form>
|
||||
</li>
|
||||
}
|
||||
else
|
||||
{
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-controller="Account" asp-action="Register">Registrarse</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-controller="Account" asp-action="Login">Iniciar sesión</a>
|
||||
</li>
|
||||
}
|
||||
</ul>
|
||||
<div class="app-wrapper">
|
||||
<aside class="sidebar">
|
||||
<a class="sidebar-brand" asp-area="" asp-controller="Home" asp-action="Index">vita_asistente</a>
|
||||
<nav class="sidebar-nav">
|
||||
<a class="nav-link @(controller == "Home" ? "active" : "")" asp-controller="Home" asp-action="Index">Inicio</a>
|
||||
|
||||
@if (User.IsInRole("Admin"))
|
||||
{
|
||||
<h6 class="sidebar-heading">Administración</h6>
|
||||
<a class="nav-link @(controller == "Usuarios" ? "active" : "")" asp-controller="Usuarios" asp-action="Index">Usuarios</a>
|
||||
<a class="nav-link @(controller == "Roles" ? "active" : "")" asp-controller="Roles" asp-action="Index">Roles</a>
|
||||
<a class="nav-link @(controller == "Pacientes" ? "active" : "")" asp-controller="Pacientes" asp-action="Index">Pacientes</a>
|
||||
}
|
||||
|
||||
@if (User.Identity?.IsAuthenticated ?? false)
|
||||
{
|
||||
<h6 class="sidebar-heading">Cuenta</h6>
|
||||
<a class="nav-link" asp-controller="Account" asp-action="Logout">Cerrar sesión</a>
|
||||
}
|
||||
else
|
||||
{
|
||||
<h6 class="sidebar-heading">Cuenta</h6>
|
||||
<a class="nav-link" asp-controller="Account" asp-action="Register">Registrarse</a>
|
||||
<a class="nav-link" asp-controller="Account" asp-action="Login">Iniciar sesión</a>
|
||||
}
|
||||
</nav>
|
||||
</aside>
|
||||
|
||||
<div class="main-content">
|
||||
<header class="topbar">
|
||||
@if (User.Identity?.IsAuthenticated ?? false)
|
||||
{
|
||||
<span class="navbar-text">Hola, @(User.Identity?.Name ?? "Usuario")!</span>
|
||||
}
|
||||
</header>
|
||||
|
||||
<main role="main" class="pb-3">
|
||||
@RenderBody()
|
||||
</main>
|
||||
|
||||
<footer class="border-top footer text-muted">
|
||||
<div class="container">
|
||||
© 2026 - vita_asistente - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacidad</a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
<div class="container">
|
||||
<main role="main" class="pb-3">
|
||||
@RenderBody()
|
||||
</main>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer class="border-top footer text-muted">
|
||||
<div class="container">
|
||||
© 2026 - vita_asistente - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
|
||||
</div>
|
||||
</footer>
|
||||
<script src="~/lib/jquery/dist/jquery.min.js"></script>
|
||||
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
|
||||
<script src="~/js/site.js" asp-append-version="true"></script>
|
||||
@await RenderSectionAsync("Scripts", required: false)
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
@@ -0,0 +1,95 @@
|
||||
@using Microsoft.AspNetCore.Authorization
|
||||
@using Microsoft.AspNetCore.Identity
|
||||
@inject SignInManager<ApplicationUser> SignInManager
|
||||
@inject UserManager<ApplicationUser> UserManager
|
||||
|
||||
<nav class="sidebar">
|
||||
<div class="sidebar-header d-flex align-items-center justify-content-between mb-4 px-3">
|
||||
<a class="text-decoration-none" asp-controller="Home" asp-action="Index">
|
||||
<span class="h5 fw-bold text-dark">VitaAsistente</span>
|
||||
</a>
|
||||
<button id="sidebarToggle" class="btn btn-sm p-0 ms-auto d-md-none" aria-label="Toggle sidebar">
|
||||
<i class="bi bi-list"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@if (SignInManager.IsSignedIn(User))
|
||||
{
|
||||
<div class="sidebar-user-info mb-4 px-3 pb-2 border-bottom d-flex align-items-center">
|
||||
<div class="flex-grow-1 text-truncate">
|
||||
<small class="text-muted">Hola,</small>
|
||||
<span class="d-block small fw-medium" title="@User.Identity?.Name ?? "Usuario"">@User.Identity?.Name ?? "Usuario"</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if (User.IsInRole("Admin"))
|
||||
{
|
||||
<div class="sidebar-section pb-2 px-3">
|
||||
<h4 class="section-title mb-2">Administración</h4>
|
||||
<ul class="nav flex-column">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" asp-controller="Usuarios" asp-action="Index">
|
||||
<span class="me-2">👥</span> Gestión de Usuarios
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" asp-controller="Roles" asp-action="Index">
|
||||
<span class="me-2">📋</span> Gestión de Roles
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
}
|
||||
|
||||
@if (User.IsInRole("Admin") || User.IsInRole("Usuario"))
|
||||
{
|
||||
<div class="sidebar-section pb-2 px-3">
|
||||
<h4 class="section-title mb-2">Módulos Principales</h4>
|
||||
<ul class="nav flex-column">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" asp-controller="Home" asp-action="Index">
|
||||
<span class="me-2">🏠</span> Dashboard
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="p-4 text-center">
|
||||
<div class="mb-3">
|
||||
<i class="bi bi-person-circle" style="font-size: 2.5rem;"></i>
|
||||
</div>
|
||||
<a href="/" class="btn btn-sm btn-outline-primary">Volver al inicio</a>
|
||||
</div>
|
||||
}
|
||||
|
||||
<form asp-controller="Account" asp-action="Logout" method="post" class="sidebar-footer p-3 border-top">
|
||||
@Html.AntiForgeryToken()
|
||||
@if (SignInManager.IsSignedIn(User))
|
||||
{
|
||||
<button type="submit" class="btn btn-sm btn-outline-danger w-100">Cerrar Sesión</button>
|
||||
}
|
||||
</form>
|
||||
</nav>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const sidebar = document.querySelector('.sidebar');
|
||||
const toggleButton = document.getElementById('sidebarToggle');
|
||||
|
||||
if (toggleButton && sidebar) {
|
||||
toggleButton.addEventListener('click', function() {
|
||||
sidebar.classList.toggle('collapsed');
|
||||
// Update button icon based on state
|
||||
const icon = toggleButton.querySelector('i');
|
||||
if (sidebar.classList.contains('collapsed')) {
|
||||
icon.className = 'bi bi-arrow-bar-right';
|
||||
} else {
|
||||
icon.className = 'bi bi-list';
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
Reference in New Issue
Block a user