180 lines
7.8 KiB
PHP
180 lines
7.8 KiB
PHP
<?php
|
|
/**
|
|
* lista.php — Gestión de usuarios (admin)
|
|
*/
|
|
require_once __DIR__ . '/../../config/config.php';
|
|
require_once __DIR__ . '/../../controllers/AuthController.php';
|
|
require_once __DIR__ . '/../../models/Usuario.php';
|
|
|
|
AuthController::requerirAdmin();
|
|
|
|
$model = new UsuarioModel();
|
|
$usuarios = $model->todos();
|
|
|
|
$pageTitle = 'Gestión de Usuarios';
|
|
$activeNav = 'usuarios';
|
|
|
|
include __DIR__ . '/../../views/layout/header.php';
|
|
include __DIR__ . '/../../views/layout/sidebar.php';
|
|
include __DIR__ . '/../../views/layout/topbar.php';
|
|
?>
|
|
<div class="page-content">
|
|
|
|
<div class="breadcrumb">
|
|
<a href="<?= APP_URL ?>/dashboard.php"><i class="fa-solid fa-house"></i></a>
|
|
<i class="fa-solid fa-chevron-right sep"></i>
|
|
<span>Usuarios</span>
|
|
</div>
|
|
|
|
<?php $success = $_GET['success'] ?? ''; $error = $_GET['error'] ?? ''; ?>
|
|
<?php if ($success): ?><div class="alert alert-success"><i class="fa-solid fa-circle-check"></i> <?= htmlspecialchars($success) ?></div><?php endif; ?>
|
|
<?php if ($error): ?><div class="alert alert-danger"><i class="fa-solid fa-circle-exclamation"></i> <?= htmlspecialchars($error) ?></div><?php endif; ?>
|
|
|
|
<div class="page-header">
|
|
<div class="page-header-content">
|
|
<h1>Gestión de Usuarios</h1>
|
|
<p><?= count($usuarios) ?> usuario(s) registrado(s)</p>
|
|
</div>
|
|
<button class="btn btn-primary" data-modal="modalCrearUsuario">
|
|
<i class="fa-solid fa-user-plus"></i> Nuevo Usuario
|
|
</button>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<div class="card-body" style="padding:0">
|
|
<div class="table-responsive">
|
|
<table class="table" id="tablaUsuarios">
|
|
<thead>
|
|
<tr><th>Nombre</th><th>Usuario</th><th>Email</th><th>Área</th><th>Rol</th><th>Último acceso</th><th>Estado</th><th>Acciones</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($usuarios as $u): ?>
|
|
<tr>
|
|
<td>
|
|
<div class="d-flex align-items-center gap-2">
|
|
<div style="width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,var(--primary),var(--secondary));display:grid;place-items:center;color:#fff;font-weight:700;font-size:.75rem;flex-shrink:0">
|
|
<?= strtoupper(substr($u['nombre'],0,1).substr($u['apellido'],0,1)) ?>
|
|
</div>
|
|
<div>
|
|
<div class="fw-600"><?= htmlspecialchars($u['nombre'].' '.$u['apellido']) ?></div>
|
|
<?php if ($u['cargo']): ?>
|
|
<div class="fs-sm text-muted"><?= htmlspecialchars($u['cargo']) ?></div>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
</td>
|
|
<td><code style="background:var(--bg);padding:.15rem .4rem;border-radius:4px;font-size:.8rem"><?= htmlspecialchars($u['username']) ?></code></td>
|
|
<td><?= htmlspecialchars($u['email']) ?></td>
|
|
<td><?= htmlspecialchars($u['area'] ?? '—') ?></td>
|
|
<td>
|
|
<span class="badge badge-<?= ['administrador'=>'danger','supervisor'=>'warning','estandar'=>'primary'][$u['rol_nombre']]??'secondary' ?>">
|
|
<?= ucfirst($u['rol_nombre']) ?>
|
|
</span>
|
|
</td>
|
|
<td class="fs-sm">
|
|
<?= $u['ultimo_login'] ? date('d/m/Y H:i', strtotime($u['ultimo_login'])) : '<span class="text-muted">Nunca</span>' ?>
|
|
</td>
|
|
<td>
|
|
<span class="badge <?= $u['activo'] ? 'badge-success' : 'badge-danger' ?>">
|
|
<?= $u['activo'] ? 'Activo' : 'Inactivo' ?>
|
|
</span>
|
|
</td>
|
|
<td>
|
|
<div class="d-flex gap-1">
|
|
<a href="<?= APP_URL ?>/views/usuarios/editar.php?id=<?= $u['id'] ?>" class="btn btn-sm btn-warning" title="Editar">
|
|
<i class="fa-solid fa-pen"></i>
|
|
</a>
|
|
<?php if ($u['id'] != $_SESSION['usuario_id']): ?>
|
|
<a href="<?= APP_URL ?>/controllers/UsuarioController.php?action=eliminar&id=<?= $u['id'] ?>"
|
|
class="btn btn-sm btn-danger" title="Eliminar"
|
|
data-confirm="¿Desactivar al usuario <?= htmlspecialchars($u['nombre']) ?>?">
|
|
<i class="fa-solid fa-user-slash"></i>
|
|
</a>
|
|
<?php endif; ?>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Modal Crear Usuario -->
|
|
<div class="modal-overlay" id="modalCrearUsuario">
|
|
<div class="modal-box" style="width:min(620px,95vw)">
|
|
<div class="modal-header">
|
|
<i class="fa-solid fa-user-plus text-primary"></i>
|
|
<span class="modal-title">Crear Nuevo Usuario</span>
|
|
<button class="btn-icon" data-modal-close><i class="fa-solid fa-xmark"></i></button>
|
|
</div>
|
|
<form method="POST" action="<?= APP_URL ?>/controllers/UsuarioController.php?action=crear">
|
|
<?= csrfField() ?>
|
|
<div class="modal-body">
|
|
<div class="form-row">
|
|
<div class="form-group">
|
|
<label class="form-label">Nombre <span class="required">*</span></label>
|
|
<input type="text" class="form-control" name="nombre" required>
|
|
</div>
|
|
<div class="form-group">
|
|
<label class="form-label">Apellido <span class="required">*</span></label>
|
|
<input type="text" class="form-control" name="apellido" required>
|
|
</div>
|
|
</div>
|
|
<div class="form-row">
|
|
<div class="form-group">
|
|
<label class="form-label">Usuario <span class="required">*</span></label>
|
|
<input type="text" class="form-control" name="username" required autocomplete="off">
|
|
</div>
|
|
<div class="form-group">
|
|
<label class="form-label">Email <span class="required">*</span></label>
|
|
<input type="email" class="form-control" name="email" required>
|
|
</div>
|
|
</div>
|
|
<div class="form-row">
|
|
<div class="form-group">
|
|
<label class="form-label">Contraseña <span class="required">*</span></label>
|
|
<input type="password" class="form-control" name="password" minlength="8" required autocomplete="new-password">
|
|
</div>
|
|
<div class="form-group">
|
|
<label class="form-label">Rol <span class="required">*</span></label>
|
|
<select class="form-control" name="rol_id" required>
|
|
<?php foreach ($model->roles() as $r): ?>
|
|
<option value="<?= $r['id'] ?>"><?= ucfirst($r['nombre']) ?></option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div class="form-row">
|
|
<div class="form-group">
|
|
<label class="form-label">Cargo</label>
|
|
<input type="text" class="form-control" name="cargo">
|
|
</div>
|
|
<div class="form-group">
|
|
<label class="form-label">Área</label>
|
|
<input type="text" class="form-control" name="area">
|
|
</div>
|
|
</div>
|
|
<div class="form-group">
|
|
<label class="form-label">Supervisor</label>
|
|
<select class="form-control" name="supervisor_id">
|
|
<option value="">— Sin supervisor —</option>
|
|
<?php foreach ($model->usuariosParaSelector() as $u): ?>
|
|
<option value="<?= $u['id'] ?>"><?= htmlspecialchars($u['nombre_completo']) ?></option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" data-modal-close>Cancelar</button>
|
|
<button type="submit" class="btn btn-primary"><i class="fa-solid fa-user-plus"></i> Crear Usuario</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<script>$(document).ready(()=>initDataTable('#tablaUsuarios'))</script>
|
|
<?php include __DIR__ . '/../../views/layout/footer.php'; ?>
|