Sidebars - animaciones

This commit is contained in:
2025-07-18 12:21:26 -06:00
parent 1900091b99
commit 37dcfffd7b
69 changed files with 1282 additions and 710 deletions

View File

@@ -1391,26 +1391,3 @@ function suspenderAgencia()
header("Location: /IMPORTADORES/administrador/agenciasActivas?success=status_$accion"); header("Location: /IMPORTADORES/administrador/agenciasActivas?success=status_$accion");
exit; exit;
} }
function configuracion()
{
$conn = getConnection();
$id_usuario = $_SESSION['usuario_id'] ?? null;
if (!$id_usuario) {
die("ID de usuario no disponible en la sesión.");
}
$sql = "SELECT * FROM informacion_general WHERE id_usuario = ?";
$params = [$id_usuario];
$stmt = sqlsrv_query($conn, $sql, $params);
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
$datos = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
include __DIR__ . '/../../views/configuracion/dashboard_configuracion.php';
}

View File

@@ -18,6 +18,8 @@ function dashboard()
exit; exit;
} }
$idUsuario = $_SESSION['usuario_id'] ?? null;
include __DIR__ . '/../../views/agencias/dashboard_agencias.php'; include __DIR__ . '/../../views/agencias/dashboard_agencias.php';
} }

View File

@@ -18,7 +18,7 @@ function dashboard()
exit; exit;
} }
$nombreAgente = $_SESSION['usuario_nombre']; $idUsuario = $_SESSION['usuario_id'] ?? null;
include __DIR__ . '/../../views/agentes/dashboard_agentes.php'; include __DIR__ . '/../../views/agentes/dashboard_agentes.php';
} }

View File

@@ -128,7 +128,6 @@ function guardar()
'clave', 'tipo_identificador', 'curp', 'calle', 'num_exterior', 'num_interior', 'clave', 'tipo_identificador', 'curp', 'calle', 'num_exterior', 'num_interior',
'ciudad', 'colonia', 'pais', 'codigo_postal', 'municipio', 'estado', 'telefono', 'fax', 'observaciones' 'ciudad', 'colonia', 'pais', 'codigo_postal', 'municipio', 'estado', 'telefono', 'fax', 'observaciones'
]; ];
$sql_parts = []; $sql_parts = [];
$params = []; $params = [];
@@ -218,7 +217,7 @@ function guardar()
// Confirmar transacción // Confirmar transacción
sqlsrv_commit($conn); sqlsrv_commit($conn);
header("Location: /IMPORTADORES/configuracion/index"); header("Location: /IMPORTADORES/configuracion/index?updated=ok");
exit; exit;
} catch (Exception $e) { } catch (Exception $e) {

View File

@@ -1059,7 +1059,7 @@ function ajax_lista()
htmlspecialchars($p['Nombre'] ?? '', ENT_QUOTES), htmlspecialchars($p['Nombre'] ?? '', ENT_QUOTES),
htmlspecialchars($p['RFC'] ?? '', ENT_QUOTES), htmlspecialchars($p['RFC'] ?? '', ENT_QUOTES),
htmlspecialchars($p['Ciudad'] ?? '', ENT_QUOTES), htmlspecialchars($p['Ciudad'] ?? '', ENT_QUOTES),
htmlspecialchars($p['Telefono']?? '', ENT_QUOTES), htmlspecialchars($p['Telefono'] ?? '', ENT_QUOTES),
htmlspecialchars($direccion ?? '', ENT_QUOTES), htmlspecialchars($direccion ?? '', ENT_QUOTES),
// Acciones // Acciones
"<a href=\"/IMPORTADORES/proveedores/editar?clave=" . rawurlencode($clave) . "\" class=\"btn btn-sm btn-primary\">✏️</a> "<a href=\"/IMPORTADORES/proveedores/editar?clave=" . rawurlencode($clave) . "\" class=\"btn btn-sm btn-primary\">✏️</a>
@@ -1318,7 +1318,7 @@ function update_status()
"updated_at" => $updatedAt, "updated_at" => $updatedAt,
"transporte_id" => null, "transporte_id" => null,
"chofer_id" => intval($solicitud['chofer_id']), "chofer_id" => intval($solicitud['chofer_id']),
"foto_solicitud_url"=> strval($solicitud['foto_solicitud_url']), "foto_solicitud_url" => strval($solicitud['foto_solicitud_url']),
"proveedor_clave" => strval($solicitud['proveedor_clave']), "proveedor_clave" => strval($solicitud['proveedor_clave']),
"partidas" => $partidas "partidas" => $partidas
]; ];

View File

@@ -68,7 +68,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✅ Agencias Activas</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✅ Agencias Activas</h4>
<!-- TABLA DE AGENCIAS --> <!-- TABLA DE AGENCIAS -->
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped table-hover align-middle" id="tabla-agencias-activas"> <table class="table table-striped table-hover align-middle" id="tabla-agencias-activas">
<thead> <thead>

View File

@@ -129,7 +129,7 @@
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🏪 Alta de Agencias Aduanales</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🏪 Alta de Agencias Aduanales</h4>
<!-- FORMULARIO --> <!-- FORMULARIO -->
<div class="card p-4 mb-5 shadow-sm card-hover position-relative h-auto"> <div class="card p-4 mb-5 shadow-sm card-hover position-relative h-auto fade-in-up">
<form action="/IMPORTADORES/administrador/guardar_agencia" method="POST" id="formAltaAgencias"> <form action="/IMPORTADORES/administrador/guardar_agencia" method="POST" id="formAltaAgencias">
<h5 class="mb-3"> Nueva Agencia Aduanal</h5> <h5 class="mb-3"> Nueva Agencia Aduanal</h5>
<div class="row g-3"> <div class="row g-3">

View File

@@ -163,7 +163,7 @@
<div class="content"> <div class="content">
<h3 class="mb-4 animate__animated animate__fadeInDown title_glow">👥 Alta de Usuarios</h3> <h3 class="mb-4 animate__animated animate__fadeInDown title_glow">👥 Alta de Usuarios</h3>
<!-- FORMULARIO --> <!-- FORMULARIO -->
<div class="card p-4 mb-4 shadow-sm bg-white card-hover position-relative h-auto"> <div class="card p-4 mb-4 shadow-sm bg-white card-hover position-relative h-auto fade-in-up">
<form action="/IMPORTADORES/administrador/guardar_usuario" method="POST" id="formAltaUsuarios"> <form action="/IMPORTADORES/administrador/guardar_usuario" method="POST" id="formAltaUsuarios">
<h5 class="mb-3"> Nuevo Usuario</h5> <h5 class="mb-3"> Nuevo Usuario</h5>
<div class="row g-3"> <div class="row g-3">

View File

@@ -70,7 +70,7 @@
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✅ Aprobación de Agencias Aduanales</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✅ Aprobación de Agencias Aduanales</h4>
<!-- TABLA DE AGENCIAS --> <!-- TABLA DE AGENCIAS -->
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<h5 class="mb-3">🏪 Agencias Solicitantes</h5> <h5 class="mb-3">🏪 Agencias Solicitantes</h5>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped table-hover align-middle" id="tabla-agencias-pendientes"> <table class="table table-striped table-hover align-middle" id="tabla-agencias-pendientes">

View File

@@ -69,7 +69,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✅ Aprobación de Usuarios</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✅ Aprobación de Usuarios</h4>
<!-- TABLA DE USUARIOS --> <!-- TABLA DE USUARIOS -->
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<h5 class="mb-3">👥 Usuarios Solicitantes</h5> <h5 class="mb-3">👥 Usuarios Solicitantes</h5>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped table-hover align-middle" id="tabla-usuarios-pendientes"> <table class="table table-striped table-hover align-middle" id="tabla-usuarios-pendientes">

View File

@@ -38,6 +38,9 @@
.btn-violet { background-color: #8b5cf6; color: white; } .btn-violet { background-color: #8b5cf6; color: white; }
.text-violet { color: #8b5cf6; } .text-violet { color: #8b5cf6; }
.btn-violet:hover { background-color: #7c3aed; color: white; } .btn-violet:hover { background-color: #7c3aed; color: white; }
.btn-lila { background-color: #c4b5fd; /* violeta claro */ color: white; border: none; }
.btn-lila:hover { background-color: #a78bfa; /* tono ligeramente más fuerte */ color: white; }
.text-lila { color: #c4b5fd; }
/* A partir de dispositivos medianos (>=768px), deja espacio lateral */ /* A partir de dispositivos medianos (>=768px), deja espacio lateral */
@media (min-width: 768px) { .content { margin-left: 250px; /* Ancho del sidebar */ } } @media (min-width: 768px) { .content { margin-left: 250px; /* Ancho del sidebar */ } }
/* En móviles, sin margen lateral */ /* En móviles, sin margen lateral */
@@ -49,22 +52,39 @@
} }
.card { border-radius: 12px; } .card { border-radius: 12px; }
/* Animaciones personalizadas */ /* Animaciones personalizadas */
.card-hover { transition: all 0.3s ease; } .card-hover { transition: all 0.3s ease; cursor: pointer; }
.card-hover:hover { transform: translateY(-5px); box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; } .card-hover:hover { transform: translateY(-8px) saqcle(1.02); box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.15) !important; }
.btn-pulse { animation: pulse 2s infinite; } .btn-pulse { animation: pulse 2s infinite; }
@keyframes pulse { @keyframes pulse {
0% { transform: scale(1); } 0% { transform: scale(1); }
50% { transform: scale(1.05); } 50% { transform: scale(1.05); }
100% { transform: scale(1); } 100% { transform: scale(1); }
} }
.fade-in-up { animation: fadeInUp 0.6s ease-out; } .fade-in-up { animation: fadeInUp 0.8s ease-out; }
@keyframes fadeInUp { @keyframes fadeInUp {
from { opacity: 0; transform: translateY(30px); } from { opacity: 0; transform: translateY(30px); }
to { opacity: 1; transform: translateY(0); } to { opacity: 1; transform: translateY(0); }
} }
.loading-spinner { display: none; } .loading-spinner { display: none; }
/* Botón con efecto de loading */
.btn-loading { position: relative; color: transparent !important; pointer-events: none; }
.btn-loading::after { content: ''; position: absolute; width: 20px; height: 20px; top: 50%; left: 50%; margin-left: -10px;
margin-top: -10px; border: 2px solid #fff; border-radius: 50%; border-top-color: transparent; animation: spin 1s linear infinite; }
.btn-loading .loading-spinner { display: inline-block; } .btn-loading .loading-spinner { display: inline-block; }
.btn-loading .btn-text { display: none; } .btn-loading .btn-text { display: none; }
@keyframes spin { to { transform: rotate(360deg); } }
/* Responsive animations */
@media (max-width: 768px) { .card-hover:hover { transform: translateY(-4px) scale(1.01); } }
/* Efecto de glow para elementos activos */
.btn.active { box-shadow: 0 0 20px rgba(var(--bs-primary-rgb), 0.5); }
/* Animación para el título */
.title-glow { text-shadow: 0 0 10px rgba(0, 123, 255, 0.3); }
/* Efecto para botones */
.btn-animated { transition: all 0.3s ease; position: relative; overflow: hidden; }
.btn-animated:hover { transform: translateY(-2px); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); }
.btn-animated::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); transition: left 0.5s; }
.btn-animated:hover::before { left: 100%; }
/* Animación para alertas */ /* Animación para alertas */
.alert-animated { animation: slideInDown 0.5s ease-out; } .alert-animated { animation: slideInDown 0.5s ease-out; }
@keyframes slideInDown { @keyframes slideInDown {
@@ -87,70 +107,110 @@
<!-- <?php // if ($catalogosData['catalogos_activos']): ?> --> <!-- <?php // if ($catalogosData['catalogos_activos']): ?> -->
<div class="row g-4"> <div class="row g-4">
<!-- <?php <?php
// $delay = 0; $delay = 0;
// foreach ($catalogosData['catalogos'] as $catalogo): // foreach ($catalogosData['catalogos'] as $catalogo):
// $delay += 0.1; // Incrementar el retraso para cada catálogo $delay += 0.1; // Incrementar el retraso para cada catálogo
?> --> ?>
<div class="col-md-4"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: <?= $delay ?>s;">
<div class="card shadow-sm p-3"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<h5 class="text-teal">Aprobar agencias</h5> <div class="card-body p-0 d-flex flex-column">
<p>Aprueba las agencias que solicitaron un registro.</p> <h5 class="text-teal mb-3">Aprobar agencias</h5>
<a href="/IMPORTADORES/administrador/aprobarAgencias" <p class="text-muted small flex-grow-1 mb-4">Aprueba las agencias que solicitaron un registro.</p>
class="btn btn-teal btn-sm mt-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/sistemas/aprobarAgencias' ? 'active' : '' ?>"> <div class="mt-auto">
Ver agencias solicitantes</a> <button class="btn btn-teal btn-sm mt-2 mt-auto w-100 btn-animated"
onclick="navigateWithAnimation(this, '/IMPORTADORES/administrador/aprobarAgencias')"
data-url="/IMPORTADORES/administrador/aprobarAgencias">
<span class="loading-spinner spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span class="btn-text">Ver agencias solicitantes</span>
</button>
</div>
</div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: <?= $delay ?>s;">
<div class="card shadow-sm p-3"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<h5 class="text-lime">Alta de agencias</h5> <div class="card-body p-0 d-flex flex-column">
<p>Da de alta manualmente una agencia.</p> <h5 class="text-lime mb-3">Alta de agencias</h5>
<a href="/IMPORTADORES/administrador/altaAgencias" <p class="text-muted small flex-grow-1 mb-4">Da de alta manualmente una agencia.</p>
class="btn btn-lime btn-sm mt-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/sistemas/altaAgencias' ? 'active' : '' ?>"> <div class="mt-auto">
Nueva agencia <button class="btn btn-lime btn-sm mt-auto w-100 btn-animated"
</a> onclick="navigateWithAnimation(this, '/IMPORTADORES/administrador/altaAgencias')"
data-url="/IMPORTADORES/administrador/altaAgencias">
<span class="loading-spinner spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span class="btn-text">Nueva agencia</span>
</button>
</div>
</div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: <?= $delay ?>s;">
<div class="card shadow-sm p-3"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<h5 class="text-success">Aprobar de usuarios</h5> <div class="card-body p-0 d-flex flex-column">
<p>Aprueba los usuarios que solicitaron un registro.</p> <h5 class="text-success mb-3">Aprobar de usuarios</h5>
<a href="/IMPORTADORES/administrador/aprobarUsuarios" <p class="text-muted small flex-grow-1 mb-4">Aprueba los usuarios que solicitaron un registro.</p>
class="btn btn-success btn-sm mt-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/sistemas/aprobarUsuarios' ? 'active' : '' ?>"> <div class="mt-auto">
Ver usuarios solicitantes <button class="btn btn-success btn-sm mt-auto w-100 btn-animated"
</a> onclick="navigateWithAnimation(this, '/IMPORTADORES/administrador/aprobarUsuarios')"
data-url="/IMPORTADORES/administrador/aprobarUsuarios">
<span class="loading-spinner spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span class="btn-text">Ver usuarios solicitantes</span>
</button>
</div>
</div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: <?= $delay ?>s;">
<div class="card shadow-sm p-3"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<h5 class="text-info">Alta de usuarios</h5> <div class="card-body p-0 d-flex flex-column">
<p>Da de alta manualmente a un usuario.</p> <h5 class="text-info mb-3">Alta de usuarios</h5>
<a href="/IMPORTADORES/administrador/altaUsuarios" <p class="text-muted small flex-grow-1 mb-4">Da de alta manualmente a un usuario.</p>
class="btn btn-info btn-sm mt-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/sistemas/altaUsuarios' ? 'active' : '' ?>"> <div class="mt-auto">
Nuevo usuario <button class="btn btn-info btn-sm mt-auto w-100 btn-animated"
</a> onclick="navigateWithAnimation(this, '/IMPORTADORES/administrador/altaUsuarios')"
data-url="/IMPORTADORES/administrador/altaUsuarios">
<span class="loading-spinner spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span class="btn-text">Nuevo usuario</span>
</button>
</div>
</div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: <?= $delay ?>s;">
<div class="card shadow-sm p-3"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<h5 class="text-warning">Configuración</h5> <div class="card-body p-0 d-flex flex-column">
<p>Administra los datos de tu agencia.</p> <h5 class="text-warning mb-3">Configuración</h5>
<a href="/IMPORTADORES/administrador/configuracion" <p class="text-muted small flex-grow-1 mb-4">Administra los datos de tu empresa y preferencias.</p>
class="btn btn-warning btn-sm mt-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/sistemas/configuracion' ? 'active' : '' ?>"> <div class="mt-auto">
Configurar <button class="btn btn-warning btn-sm mt-auto w-100 btn-animated"
</a> onclick="navigateWithAnimation(this, '/IMPORTADORES/configuracion')"
data-url="/IMPORTADORES/configuracion">
<span class="loading-spinner spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span class="btn-text">Ir a configuración</span>
</button>
</div>
</div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: <?= $delay ?>s;">
<div class="card shadow-sm p-3"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<h5 class="text-danger">Cerrar sesión</h5> <div class="card-body p-0 d-flex flex-column">
<p>Salir del sistema de forma segura.</p> <h5 class="text-danger mb-3">Cerrar sesión</h5>
<a href="/IMPORTADORES/sistemas/logout" class="btn btn-danger btn-sm mt-2">Logout</a> <p class="text-muted small flex-grow-1 mb-4">Salir del sistema de forma segura.</p>
<div class="mt-auto">
<button class="btn btn-danger btn-sm mt-auto w-100 btn-animated"
onclick="navigateWithAnimation(this, '/IMPORTADORES/sistemas/logout')"
data-url="/IMPORTADORES/sistemas/logout">
<span class="loading-spinner spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span class="btn-text">Cerrar sesión</span>
</button>
</div>
</div>
</div> </div>
</div> </div>
<!-- <?php // endforeach; ?> --> <!-- <?php // endforeach; ?> -->

View File

@@ -70,7 +70,7 @@
<!-- 📄 CONTENIDO --> <!-- 📄 CONTENIDO -->
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🚷 Usuarios Inactivos</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🚷 Usuarios Inactivos</h4>
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped" id="tabla-inactivos"> <table class="table table-striped" id="tabla-inactivos">
<thead class="table-dark"> <thead class="table-dark">

View File

@@ -162,7 +162,7 @@
<div class="content px-4"> <div class="content px-4">
<h3 class="mb-4 animate__animated animate__fadeInDown title_glow">👨‍✈️ Administración de Agentes</h3> <h3 class="mb-4 animate__animated animate__fadeInDown title_glow">👨‍✈️ Administración de Agentes</h3>
<!-- FORMULARIO --> <!-- FORMULARIO -->
<div class="card p-4 mb-4 shadow-sm bg-white card-hover position-relative h-auto"> <div class="card p-4 mb-4 shadow-sm bg-white card-hover position-relative h-auto fade-in-up">
<form action="/IMPORTADORES/agencias/guardarAgente" method="POST" id="formAltaAgentes"> <form action="/IMPORTADORES/agencias/guardarAgente" method="POST" id="formAltaAgentes">
<h5 class="mb-3"> Nuevo Agente</h5> <h5 class="mb-3"> Nuevo Agente</h5>
<div class="row g-3"> <div class="row g-3">
@@ -200,8 +200,8 @@
</form> </form>
</div> </div>
<h4 class="mb-4">✅ Agentes Activos</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✅ Agentes Activos</h4>
<div class="card p-3 shadow-sm"> <div class="card p-3 shadow-sm fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped table-hover align-middle" id="tabla-agentes-activos"> <table class="table table-striped table-hover align-middle" id="tabla-agentes-activos">
<thead class="table-dark"> <thead class="table-dark">
@@ -227,7 +227,7 @@
<td> <td>
<?php if (in_array($a['tipo_usuario_sistema'], ['agente_aduanal'])): ?> <?php if (in_array($a['tipo_usuario_sistema'], ['agente_aduanal'])): ?>
<a href="/IMPORTADORES/vinculaciones/desvincularAgencia?id=<?= $a['id_relacion'] ?>&tipo=<?= $a['tipo_vinculacion'] ?>" <a href="/IMPORTADORES/vinculaciones/desvincularAgencia?id=<?= $a['id_relacion'] ?>&tipo=<?= $a['tipo_vinculacion'] ?>"
class="btn btn-sm btn-danger" class="btn btn-sm btn-danger mt-auto w-auto btn-animated"
onclick="return confirm('¿Está seguro de que desea desvincular este usuario?')"> onclick="return confirm('¿Está seguro de que desea desvincular este usuario?')">
Desvincular Desvincular
</a> </a>

View File

@@ -38,6 +38,9 @@
.btn-violet { background-color: #8b5cf6; color: white; } .btn-violet { background-color: #8b5cf6; color: white; }
.text-violet { color: #8b5cf6; } .text-violet { color: #8b5cf6; }
.btn-violet:hover { background-color: #7c3aed; color: white; } .btn-violet:hover { background-color: #7c3aed; color: white; }
.btn-lila { background-color: #c4b5fd; /* violeta claro */ color: white; border: none; }
.btn-lila:hover { background-color: #a78bfa; /* tono ligeramente más fuerte */ color: white; }
.text-lila { color: #c4b5fd; }
/* A partir de dispositivos medianos (>=768px), deja espacio lateral */ /* A partir de dispositivos medianos (>=768px), deja espacio lateral */
@media (min-width: 768px) { .content { margin-left: 250px; /* Ancho del sidebar */ } } @media (min-width: 768px) { .content { margin-left: 250px; /* Ancho del sidebar */ } }
/* En móviles, sin margen lateral */ /* En móviles, sin margen lateral */
@@ -49,22 +52,39 @@
} }
.card { border-radius: 12px; } .card { border-radius: 12px; }
/* Animaciones personalizadas */ /* Animaciones personalizadas */
.card-hover { transition: all 0.3s ease; } .card-hover { transition: all 0.3s ease; cursor: pointer; }
.card-hover:hover { transform: translateY(-5px); box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; } .card-hover:hover { transform: translateY(-8px) saqcle(1.02); box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.15) !important; }
.btn-pulse { animation: pulse 2s infinite; } .btn-pulse { animation: pulse 2s infinite; }
@keyframes pulse { @keyframes pulse {
0% { transform: scale(1); } 0% { transform: scale(1); }
50% { transform: scale(1.05); } 50% { transform: scale(1.05); }
100% { transform: scale(1); } 100% { transform: scale(1); }
} }
.fade-in-up { animation: fadeInUp 0.6s ease-out; } .fade-in-up { animation: fadeInUp 0.8s ease-out; }
@keyframes fadeInUp { @keyframes fadeInUp {
from { opacity: 0; transform: translateY(30px); } from { opacity: 0; transform: translateY(30px); }
to { opacity: 1; transform: translateY(0); } to { opacity: 1; transform: translateY(0); }
} }
.loading-spinner { display: none; } .loading-spinner { display: none; }
/* Botón con efecto de loading */
.btn-loading { position: relative; color: transparent !important; pointer-events: none; }
.btn-loading::after { content: ''; position: absolute; width: 20px; height: 20px; top: 50%; left: 50%; margin-left: -10px;
margin-top: -10px; border: 2px solid #fff; border-radius: 50%; border-top-color: transparent; animation: spin 1s linear infinite; }
.btn-loading .loading-spinner { display: inline-block; } .btn-loading .loading-spinner { display: inline-block; }
.btn-loading .btn-text { display: none; } .btn-loading .btn-text { display: none; }
@keyframes spin { to { transform: rotate(360deg); } }
/* Responsive animations */
@media (max-width: 768px) { .card-hover:hover { transform: translateY(-4px) scale(1.01); } }
/* Efecto de glow para elementos activos */
.btn.active { box-shadow: 0 0 20px rgba(var(--bs-primary-rgb), 0.5); }
/* Animación para el título */
.title-glow { text-shadow: 0 0 10px rgba(0, 123, 255, 0.3); }
/* Efecto para botones */
.btn-animated { transition: all 0.3s ease; position: relative; overflow: hidden; }
.btn-animated:hover { transform: translateY(-2px); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); }
.btn-animated::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); transition: left 0.5s; }
.btn-animated:hover::before { left: 100%; }
/* Animación para alertas */ /* Animación para alertas */
.alert-animated { animation: slideInDown 0.5s ease-out; } .alert-animated { animation: slideInDown 0.5s ease-out; }
@keyframes slideInDown { @keyframes slideInDown {
@@ -87,82 +107,127 @@
<!-- <?php // if ($catalogosData['catalogos_activos']): ?> --> <!-- <?php // if ($catalogosData['catalogos_activos']): ?> -->
<div class="row g-4"> <div class="row g-4">
<!-- <?php <?php
// $delay = 0; $delay = 0;
// foreach ($catalogosData['catalogos'] as $catalogo): // foreach ($catalogosData['catalogos'] as $catalogo):
// $delay += 0.1; // Incrementar el retraso para cada catálogo $delay += 0.1; // Incrementar el retraso para cada catálogo
?> --> ?>
<div class="col-md-4"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: <?= $delay ?>s;">
<div class="card shadow-sm p-3"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<h5 class="text-teal">Solicitudes de vinculación</h5> <div class="card-body p-0 d-flex flex-column">
<p>Aprueba las solicitudes de vinculación de los importadores.</p> <h5 class="text-teal mb-3">Solicitudes de vinculación</h5>
<a href="/IMPORTADORES/vinculaciones/solicitudesVinculacion" <p class="text-muted small flex-grow-1 mb-4">Aprueba las solicitudes de vinculación de los importadores.</p>
class="btn btn-teal btn-sm mt-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/vinculaciones/solicitudesVinculacion' ? 'active' : '' ?>"> <div class="mt-auto">
Ver solicitudes <button class="btn btn-teal btn-sm mt-auto w-100 btn-animated"
</a> onclick="navigateWithAnimation(this, '/IMPORTADORES/vinculaciones/solicitudesVinculacion')"
data-url="/IMPORTADORES/vinculaciones/solicitudesVinculacion">
<span class="loading-spinner spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span class="btn-text">Ver solicitudes</span>
</button>
</div>
</div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: <?= $delay ?>s;">
<div class="card shadow-sm p-3"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<h5 class="text-lime">Usuarios vinculados</h5> <div class="card-body p-0 d-flex flex-column">
<p>Consulta los que ya fueron autorizados.</p> <h5 class="text-lime mb-3">Usuarios vinculados</h5>
<a href="/IMPORTADORES/vinculaciones/vinculacionesAgencia" <p class="text-muted small flex-grow-1 mb-4">Consulta los que ya fueron autorizados.</p>
class="btn btn-lime btn-sm mt-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/vinculaciones/vinculacionesAgencia' ? 'active' : '' ?>"> <div class="mt-auto">
Ver usuarios <button class="btn btn-lime btn-sm mt-auto w-100 btn-animated"
</a> onclick="navigateWithAnimation(this, '/IMPORTADORES/vinculaciones/vinculacionesAgencia')"
data-url="/IMPORTADORES/vinculaciones/vinculacionesAgencia">
<span class="loading-spinner spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span class="btn-text">Ver usuarios</span>
</button>
</div>
</div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: <?= $delay ?>s;">
<div class="card shadow-sm p-3"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<h5 class="text-success">Alta de agentes</h5> <div class="card-body p-0 d-flex flex-column">
<p>Da de alta a tus agentes aduanales.</p> <h5 class="text-success mb-3">Patentes</h5>
<a href="/IMPORTADORES/agencias/alta" <p class="text-muted small flex-grow-1 mb-4">Gestiona las patentes de la agencia.</p>
class="btn btn-success btn-sm mt-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/agencias/alta' ? 'active' : '' ?>"> <div class="mt-auto">
Nuevo agente <button class="btn btn-success btn-sm mt-auto w-100 btn-animated"
</a> onclick="navigateWithAnimation(this, '/IMPORTADORES/patente/dashboard')"
data-url="/IMPORTADORES/patente/dashboard">
<span class="loading-spinner spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span class="btn-text">Ver agentes</span>
</button>
</div>
</div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: <?= $delay ?>s;">
<div class="card shadow-sm p-3"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<h5 class="text-info">Patentes</h5> <div class="card-body p-0 d-flex flex-column">
<p>Gestiona las patentes de la agencia.</p> <h5 class="text-info mb-3">Locaciones</h5>
<a href="/IMPORTADORES/patente/dashboard" <p class="text-muted small flex-grow-1 mb-4">Gestiona la locaciones validas para nuevos registros.</p>
class="btn btn-info btn-sm mt-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/patente/dashboard' ? 'active' : '' ?>"> <div class="mt-auto">
Ver agentes <button class="btn btn-info btn-sm mt-auto w-100 btn-animated"
</a> onclick="navigateWithAnimation(this, '/IMPORTADORES/locaciones/lista')"
data-url="/IMPORTADORES/locaciones/lista">
<span class="loading-spinner spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span class="btn-text">Gestionar locaciones</span>
</button>
</div>
</div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: <?= $delay ?>s;">
<div class="card shadow-sm p-3"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<h5 class="text-cyan">Locaciones</h5> <div class="card-body p-0 d-flex flex-column">
<p>Gestiona la locaciones validas para nuevos registros.</p> <h5 class="text-cyan mb-3">Alta de agentes</h5>
<a href="/IMPORTADORES/locaciones/lista" <p class="text-muted small flex-grow-1 mb-4">Da de alta a tus agentes aduanales.</p>
class="btn btn-cyan btn-sm mt-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/locaciones/lista' ? 'active' : '' ?>"> <div class="mt-auto">
Gestionar locaciones <button class="btn btn-cyan btn-sm mt-auto w-100 btn-animated"
</a> onclick="navigateWithAnimation(this, '/IMPORTADORES/agencias/alta')"
data-url="/IMPORTADORES/agencias/alta">
<span class="loading-spinner spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span class="btn-text">Nuevo agente</span>
</button>
</div>
</div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: <?= $delay ?>s;">
<div class="card shadow-sm p-3"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<h5 class="text-warning">Configuración</h5> <div class="card-body p-0 d-flex flex-column">
<p>Administra tus datos y preferencias.</p> <h5 class="text-warning mb-3">Configuración</h5>
<a href="/IMPORTADORES/configuracion" <p class="text-muted small flex-grow-1 mb-4">Administra los datos de tu empresa y preferencias.</p>
class="btn btn-warning btn-sm mt-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/agencias/configuracion' ? 'active' : '' ?>"> <div class="mt-auto">
Configurar <button class="btn btn-warning btn-sm mt-auto w-100 btn-animated"
</a> onclick="navigateWithAnimation(this, '/IMPORTADORES/configuracion')"
data-url="/IMPORTADORES/configuracion">
<span class="loading-spinner spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span class="btn-text">Ir a configuración</span>
</button>
</div>
</div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: <?= $delay ?>s;">
<div class="card shadow-sm p-3"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<h5 class="text-danger">Cerrar sesión</h5> <div class="card-body p-0 d-flex flex-column">
<p>Salir del sistema de forma segura.</p> <h5 class="text-danger mb-3">Cerrar sesión</h5>
<a href="/IMPORTADORES/sistemas/logout" class="btn btn-danger btn-sm mt-2">Logout</a> <p class="text-muted small flex-grow-1 mb-4">Salir del sistema de forma segura.</p>
<div class="mt-auto">
<button class="btn btn-danger btn-sm mt-auto w-100 btn-animated"
onclick="navigateWithAnimation(this, '/IMPORTADORES/sistemas/logout')"
data-url="/IMPORTADORES/sistemas/logout">
<span class="loading-spinner spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span class="btn-text">Cerrar sesión</span>
</button>
</div>
</div>
</div> </div>
</div> </div>
<!-- <?php // endforeach; ?> --> <!-- <?php // endforeach; ?> -->

View File

@@ -41,6 +41,9 @@ include __DIR__ . '/../partials/sidebar_agente.php';
.btn-violet { background-color: #8b5cf6; color: white; } .btn-violet { background-color: #8b5cf6; color: white; }
.text-violet { color: #8b5cf6; } .text-violet { color: #8b5cf6; }
.btn-violet:hover { background-color: #7c3aed; color: white; } .btn-violet:hover { background-color: #7c3aed; color: white; }
.btn-lila { background-color: #c4b5fd; /* violeta claro */ color: white; border: none; }
.btn-lila:hover { background-color: #a78bfa; /* tono ligeramente más fuerte */ color: white; }
.text-lila { color: #c4b5fd; }
/* A partir de dispositivos medianos (>=768px), deja espacio lateral */ /* A partir de dispositivos medianos (>=768px), deja espacio lateral */
@media (min-width: 768px) { .content { margin-left: 250px; /* Ancho del sidebar */ } } @media (min-width: 768px) { .content { margin-left: 250px; /* Ancho del sidebar */ } }
/* En móviles, sin margen lateral */ /* En móviles, sin margen lateral */
@@ -52,22 +55,39 @@ include __DIR__ . '/../partials/sidebar_agente.php';
} }
.card { border-radius: 12px; } .card { border-radius: 12px; }
/* Animaciones personalizadas */ /* Animaciones personalizadas */
.card-hover { transition: all 0.3s ease; } .card-hover { transition: all 0.3s ease; cursor: pointer; }
.card-hover:hover { transform: translateY(-5px); box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; } .card-hover:hover { transform: translateY(-8px) saqcle(1.02); box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.15) !important; }
.btn-pulse { animation: pulse 2s infinite; } .btn-pulse { animation: pulse 2s infinite; }
@keyframes pulse { @keyframes pulse {
0% { transform: scale(1); } 0% { transform: scale(1); }
50% { transform: scale(1.05); } 50% { transform: scale(1.05); }
100% { transform: scale(1); } 100% { transform: scale(1); }
} }
.fade-in-up { animation: fadeInUp 0.6s ease-out; } .fade-in-up { animation: fadeInUp 0.8s ease-out; }
@keyframes fadeInUp { @keyframes fadeInUp {
from { opacity: 0; transform: translateY(30px); } from { opacity: 0; transform: translateY(30px); }
to { opacity: 1; transform: translateY(0); } to { opacity: 1; transform: translateY(0); }
} }
.loading-spinner { display: none; } .loading-spinner { display: none; }
/* Botón con efecto de loading */
.btn-loading { position: relative; color: transparent !important; pointer-events: none; }
.btn-loading::after { content: ''; position: absolute; width: 20px; height: 20px; top: 50%; left: 50%; margin-left: -10px;
margin-top: -10px; border: 2px solid #fff; border-radius: 50%; border-top-color: transparent; animation: spin 1s linear infinite; }
.btn-loading .loading-spinner { display: inline-block; } .btn-loading .loading-spinner { display: inline-block; }
.btn-loading .btn-text { display: none; } .btn-loading .btn-text { display: none; }
@keyframes spin { to { transform: rotate(360deg); } }
/* Responsive animations */
@media (max-width: 768px) { .card-hover:hover { transform: translateY(-4px) scale(1.01); } }
/* Efecto de glow para elementos activos */
.btn.active { box-shadow: 0 0 20px rgba(var(--bs-primary-rgb), 0.5); }
/* Animación para el título */
.title-glow { text-shadow: 0 0 10px rgba(0, 123, 255, 0.3); }
/* Efecto para botones */
.btn-animated { transition: all 0.3s ease; position: relative; overflow: hidden; }
.btn-animated:hover { transform: translateY(-2px); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); }
.btn-animated::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); transition: left 0.5s; }
.btn-animated:hover::before { left: 100%; }
/* Animación para alertas */ /* Animación para alertas */
.alert-animated { animation: slideInDown 0.5s ease-out; } .alert-animated { animation: slideInDown 0.5s ease-out; }
@keyframes slideInDown { @keyframes slideInDown {
@@ -90,60 +110,93 @@ include __DIR__ . '/../partials/sidebar_agente.php';
<!-- <?php // if ($catalogosData ['catalogos_activos']): ?> --> <!-- <?php // if ($catalogosData ['catalogos_activos']): ?> -->
<div class="row g-4"> <div class="row g-4">
<!-- <?php <?php
// $delay = 0; $delay = 0;
// foreach ($catalogosData['catalogos'] as $catalogo): // foreach ($catalogosData['catalogos'] as $catalogo):
// $delay += 0.1; // Incrementar el retraso para cada catálogo $delay += 0.1; // Incrementar el retraso para cada catálogo
?> --> ?>
<div class="col-md-4"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: <?= $delay ?>s;">
<div class="card shadow-sm p-3"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<h5 class="text-teal">Importadores vinculados</h5> <div class="card-body p-0 d-flex flex-column">
<p>Consulta los que ya fueron autorizados.</p> <h5 class="text-teal mb-3">Importadores vinculados</h5>
<a href="/IMPORTADORES/agentes/vinculados" <p class="text-muted small flex-grow-1 mb-4">Consulta los que ya fueron autorizados.</p>
class="btn btn-teal btn-sm mt-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/agentes/vinculados' ? 'active' : '' ?>"> <div class="mt-auto">
Ver importadores <button class="btn btn-teal btn-sm mt-auto w-100 btn-animated"
</a> onclick="navigateWithAnimation(this, '/IMPORTADORES/agentes/vinculados')"
data-url="/IMPORTADORES/agentes/vinculados">
<span class="loading-spinner spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span class="btn-text">Ver importadores</span>
</button>
</div>
</div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: <?= $delay ?>s;">
<div class="card shadow-sm p-3"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<h5 class="text-lime">Patentes</h5> <div class="card-body p-0 d-flex flex-column">
<p>Gestiona las patentes de la agencia.</p> <h5 class="text-lime mb-3">Patentes</h5>
<a href="/IMPORTADORES/patente/dashboard" <p class="text-muted small flex-grow-1 mb-4">Gestiona las patentes de la agencia.</p>
class="btn btn-lime btn-sm mt-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES//patente/dashboard' ? 'active' : '' ?>"> <div class="mt-auto">
Ver solicitudes <button class="btn btn-lime btn-sm mt-auto w-100 btn-animated"
</a> onclick="navigateWithAnimation(this, '/IMPORTADORES/patente/dashboard')"
data-url="/IMPORTADORES/patente/dashboard">
<span class="loading-spinner spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span class="btn-text">Ver patentes</span>
</button>
</div>
</div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: <?= $delay ?>s;">
<div class="card shadow-sm p-3"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<h5 class="text-success">Locaciones</h5> <div class="card-body p-0 d-flex flex-column">
<p>Gestiona la locaciones validas para nuevos registros.</p> <h5 class="text-success mb-3">Locaciones</h5>
<a href="/IMPORTADORES/locaciones/lista" <p class="text-muted small flex-grow-1 mb-4">Gestiona la locaciones validas para nuevos registros.</p>
class="btn btn-success btn-sm mt-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/locaciones/lista' ? 'active' : '' ?>"> <div class="mt-auto">
Gestionar locaciones <button class="btn btn-success btn-sm mt-auto w-100 btn-animated"
</a> onclick="navigateWithAnimation(this, '/IMPORTADORES/locaciones/lista')"
data-url="/IMPORTADORES/locaciones/lista">
<span class="loading-spinner spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span class="btn-text">Gestionar locaciones</span>
</button>
</div>
</div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: <?= $delay ?>s;">
<div class="card shadow-sm p-3"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<h5 class="text-warning">Configuración</h5> <div class="card-body p-0 d-flex flex-column">
<p>Administra tus datos y preferencias.</p> <h5 class="text-warning mb-3">Configuración</h5>
<a href="/IMPORTADORES/configuracion" <p class="text-muted small flex-grow-1 mb-4">Administra los datos de tu empresa y preferencias.</p>
class="btn btn-warning btn-sm mt-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/agentes/configuracion' ? 'active' : '' ?>"> <div class="mt-auto">
Configurar <button class="btn btn-warning btn-sm mt-auto w-100 btn-animated"
</a> onclick="navigateWithAnimation(this, '/IMPORTADORES/configuracion')"
data-url="/IMPORTADORES/configuracion">
<span class="loading-spinner spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span class="btn-text">Ir a configuración</span>
</button>
</div>
</div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: <?= $delay ?>s;">
<div class="card shadow-sm p-3"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<h5 class="text-danger">Cerrar sesión</h5> <div class="card-body p-0 d-flex flex-column">
<p>Salir del sistema de forma segura.</p> <h5 class="text-danger mb-3">Cerrar sesión</h5>
<a href="/IMPORTADORES/sistemas/logout" class="btn btn-danger btn-sm mt-2">Logout</a> <p class="text-muted small flex-grow-1 mb-4">Salir del sistema de forma segura.</p>
<div class="mt-auto">
<button class="btn btn-danger btn-sm mt-auto w-100 btn-animated"
onclick="navigateWithAnimation(this, '/IMPORTADORES/sistemas/logout')"
data-url="/IMPORTADORES/sistemas/logout">
<span class="loading-spinner spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>
<span class="btn-text">Cerrar sesión</span>
</button>
</div>
</div>
</div> </div>
</div> </div>
<!-- <?php // endforeach; ?> --> <!-- <?php // endforeach; ?> -->

View File

@@ -67,7 +67,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🏪 Registro de Agencias</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🏪 Registro de Agencias</h4>
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped" id="tabla-registros-agencias"> <table class="table table-striped" id="tabla-registros-agencias">
<thead class="table-dark"> <thead class="table-dark">

View File

@@ -67,7 +67,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🔄 Cambios de Usuario</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🔄 Cambios de Usuario</h4>
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped align-middle" id="tabla-bitacora-usuarios"> <table class="table table-striped align-middle" id="tabla-bitacora-usuarios">
<thead class="table-dark"> <thead class="table-dark">

View File

@@ -67,7 +67,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">👥 Acceso de Usuarios</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">👥 Acceso de Usuarios</h4>
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped" id="tabla-logins"> <table class="table table-striped" id="tabla-logins">
<thead class="table-dark"> <thead class="table-dark">

View File

@@ -67,7 +67,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">👥 Mi Actividad</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">👥 Mi Actividad</h4>
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped" id="tabla-logins-usuario"> <table class="table table-striped" id="tabla-logins-usuario">
<thead class="table-dark"> <thead class="table-dark">

View File

@@ -67,7 +67,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">👥 Registro de Usuarios</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">👥 Registro de Usuarios</h4>
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped" id="tabla-registros-usuarios"> <table class="table table-striped" id="tabla-registros-usuarios">
<thead class="table-dark"> <thead class="table-dark">

View File

@@ -67,7 +67,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🔗 Vinculaciones</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🔗 Vinculaciones</h4>
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped align-middle" id="tabla-bitacora-vinculaciones"> <table class="table table-striped align-middle" id="tabla-bitacora-vinculaciones">
<thead class="table-dark"> <thead class="table-dark">

View File

@@ -48,6 +48,9 @@
.btn-violet { background-color: #8b5cf6; color: white; } .btn-violet { background-color: #8b5cf6; color: white; }
.text-violet { color: #8b5cf6; } .text-violet { color: #8b5cf6; }
.btn-violet:hover { background-color: #7c3aed; color: white; } .btn-violet:hover { background-color: #7c3aed; color: white; }
.btn-lila { background-color: #c4b5fd; /* violeta claro */ color: white; border: none; }
.btn-lila:hover { background-color: #a78bfa; /* tono ligeramente más fuerte */ color: white; }
.text-lila { color: #c4b5fd; }
/* Animaciones personalizadas */ /* Animaciones personalizadas */
.card-hover { transition: all 0.3s ease; cursor: pointer; } .card-hover { transition: all 0.3s ease; cursor: pointer; }
.card-hover:hover { transform: translateY(-8px) scale(1.02); box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.15) !important; } .card-hover:hover { transform: translateY(-8px) scale(1.02); box-shadow: 0 1rem 2rem rgba(0, 0, 0, 0.15) !important; }

View File

@@ -67,7 +67,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">👥 Acceso de Usuarios</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">👥 Acceso de Usuarios</h4>
<div class="card p-3 shadow-sm"> <div class="card p-3 shadow-sm fade-in-up">
<div class="table-responsive card-hover position-relative h-auto"> <div class="table-responsive card-hover position-relative h-auto">
<table class="table table-striped" id="tabla-logins"> <table class="table table-striped" id="tabla-logins">
<thead class="table-dark"> <thead class="table-dark">

View File

@@ -67,7 +67,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🔗 Vinculaciones</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🔗 Vinculaciones</h4>
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped align-middle" id="tabla-vinculaciones-usuario"> <table class="table table-striped align-middle" id="tabla-vinculaciones-usuario">
<thead class="table-dark"> <thead class="table-dark">

View File

@@ -179,7 +179,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow"> Nuevo Chofer</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow"> Nuevo Chofer</h4>
<div class="card p-4 shadow-sm bg-white card-hover position-relative h-auto"> <div class="card p-4 shadow-sm bg-white card-hover position-relative h-auto fade-in-up">
<!-- Se agrega enctype para subir archivos --> <!-- Se agrega enctype para subir archivos -->
<form action="/IMPORTADORES/choferes/guardar" method="POST" enctype="multipart/form-data" id="formAltaChoferes"> <form action="/IMPORTADORES/choferes/guardar" method="POST" enctype="multipart/form-data" id="formAltaChoferes">
<div class="row mb-3"> <div class="row mb-3">

View File

@@ -178,7 +178,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✏️ Editar Chofer #<?= (int)$chofer['id_chofer'] ?></h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✏️ Editar Chofer #<?= (int)$chofer['id_chofer'] ?></h4>
<div class="card p-4 shadow-sm bg-white card-hover position-relative h-auto"> <div class="card p-4 shadow-sm bg-white card-hover position-relative h-auto fade-in-up">
<form action="/IMPORTADORES/choferes/actualizar" method="POST" enctype="multipart/form-data" id="formEditChoferes"> <form action="/IMPORTADORES/choferes/actualizar" method="POST" enctype="multipart/form-data" id="formEditChoferes">
<input type="hidden" name="id_chofer" value="<?= (int)$chofer['id_chofer'] ?>"> <input type="hidden" name="id_chofer" value="<?= (int)$chofer['id_chofer'] ?>">

View File

@@ -68,8 +68,8 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">👨‍✈️ Mis Choferes</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">👨‍✈️ Mis Choferes</h4>
<a href="/IMPORTADORES/choferes/crear" class="btn btn-success mb-3 mt-auto w-auto btn-animated"> Nuevo Chofer</a> <a href="/IMPORTADORES/choferes/crear" class="btn btn-success mb-3 mt-auto w-auto btn-animated fade-in-up"> Nuevo Chofer</a>
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped" id="tabla-choferes"> <table class="table table-striped" id="tabla-choferes">
<thead> <thead>

View File

@@ -8,6 +8,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<!-- Font Awesome --> <!-- Font Awesome -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<!-- Animate.css para animaciones adicionales --> <!-- Animate.css para animaciones adicionales -->
@@ -56,8 +57,29 @@
.btn-animated::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; .btn-animated::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); transition: left 0.5s; } background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); transition: left 0.5s; }
.btn-animated:hover::before { left: 100%; } .btn-animated:hover::before { left: 100%; }
label {font-weight: bold;} label {font-weight: bold; }
.section-header { background-color: #e9ecef; padding: 10px 15px; margin: 0 0 20px 0; border-radius: 8px 8px 0 0; font-weight: bold; color: #495057; } .section-header { background-color: #e9ecef; padding: 10px 15px; margin: 0 0 20px 0; border-radius: 8px 8px 0 0; font-weight: bold; color: #495057; }
/* ========== ANIMACIONES PARA INPUTS TEXTO ========== */
.form-control:not(.no-animation) { transition: all 0.3s ease; border: 2px solid #dee2e6; position: relative; }
.form-control:not(.no-animation).shake { animation: shake 0.5s ease-in-out; }
@keyframes shake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-5px); }
75% { transform: translateX(5px); }
}
/* Animación para los campos del formulario */
.form-group-animated { opacity: 0; transform: translateY(20px); animation: slideUp 0.6s ease-out forwards; }
.form-group-animated:nth-child(1) { animation-delay: 0.1s; }
.form-group-animated:nth-child(2) { animation-delay: 0.2s; }
.form-group-animated:nth-child(3) { animation-delay: 0.3s; }
.form-group-animated:nth-child(4) { animation-delay: 0.4s; }
.form-group-animated:nth-child(5) { animation-delay: 0.5s; }
.form-group-animated:nth-child(6) { animation-delay: 0.6s; }
.form-group-animated:nth-child(7) { animation-delay: 0.7s; }
.form-group-animated:nth-child(8) { animation-delay: 0.8s; }
.form-group-animated:nth-child(9) { animation-delay: 0.9s; }
.form-group-animated:nth-child(10) { animation-delay: 1.0s; }
@keyframes slideUp { to { opacity: 1; transform: translateY(0); } }
</style> </style>
</head> </head>
<body> <body>
@@ -66,18 +88,17 @@
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow"> Información General</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow"> Información General</h4>
<?php if (isset($datos['tipo_usuario']) && $datos['tipo_usuario'] === 'importador'): ?> <?php if (isset($datos['tipo_usuario']) && $datos['tipo_usuario'] === 'importador'): ?>
<div class="card shadow-sm p-4 mb-4 bg-white card-hover position-relative h-auto"> <div class="card shadow-sm p-4 mb-4 bg-white card-hover position-relative h-auto fade-in-up">
<div class="section-header">👤 Información Personal</div> <div class="section-header form-group-animated">👤 Información Personal</div>
<form> <form>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Clave:</label> <label class="col-md-2 col-form-label form-group-animated">Clave:</label>
<div class="col-md-3"> <div class="col-md-3 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['clave'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['clave'] ?? '') ?>" disabled>
</div> </div>
<div class="col-md-3"></div> <div class="col-md-3"></div>
<label class="col-md-2 col-form-label">Tipo de identificador:</label> <label class="col-md-2 col-form-label form-group-animated">Tipo de identificador:</label>
<div class="col-md-2"> <div class="col-md-2 form-group-animated">
<select name="tipo_identificador" class="form-control" disabled> <select name="tipo_identificador" class="form-control" disabled>
<option value="">-- Selecciona una opción --</option> <option value="">-- Selecciona una opción --</option>
<option value="1" <?= ($datos['tipo_identificador'] ?? '') == '1' ? 'selected' : '' ?>>1 - RFC</option> <option value="1" <?= ($datos['tipo_identificador'] ?? '') == '1' ? 'selected' : '' ?>>1 - RFC</option>
@@ -88,165 +109,166 @@
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Nombre:</label> <label class="col-md-2 col-form-label form-group-animated">Nombre:</label>
<div class="col-md-10"> <div class="col-md-10 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['nombre'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['nombre'] ?? '') ?>" disabled>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">RFC:</label> <label class="col-md-2 col-form-label form-group-animated">RFC:</label>
<div class="col-md-3"> <div class="col-md-3">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['rfc'] ?? '') ?>" disabled> <input type="text" class="form-control form-group-animated" value="<?= htmlspecialchars($datos['rfc'] ?? '') ?>" disabled>
</div> </div>
<div class="col-md-1"></div> <div class="col-md-1"></div>
<label class="col-md-1 col-form-label">CURP:</label> <label class="col-md-1 col-form-label form-group-animated">CURP:</label>
<div class="col-md-5"> <div class="col-md-5 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['curp'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['curp'] ?? '') ?>" disabled>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Calle:</label> <label class="col-md-2 col-form-label form-group-animated">Calle:</label>
<div class="col-md-10"> <div class="col-md-10 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['calle'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['calle'] ?? '') ?>" disabled>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Núm. Exterior:</label> <label class="col-md-2 col-form-label form-group-animated">Núm. Exterior:</label>
<div class="col-md-2"> <div class="col-md-2 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['num_exterior'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['num_exterior'] ?? '') ?>" disabled>
</div> </div>
<div class="col-md-4"></div> <div class="col-md-4"></div>
<label class="col-md-2 col-form-label">Núm. Interior:</label> <label class="col-md-2 col-form-label form-group-animated">Núm. Interior:</label>
<div class="col-md-2"> <div class="col-md-2 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['num_interior'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['num_interior'] ?? '') ?>" disabled>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Ciudad / Localidad:</label> <label class="col-md-2 col-form-label form-group-animated">Ciudad / Localidad:</label>
<div class="col-md-3"> <div class="col-md-3 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['ciudad'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['ciudad'] ?? '') ?>" disabled>
</div> </div>
<div class="col-md-1"></div> <div class="col-md-1"></div>
<label class="col-md-1 col-form-label">Colonia:</label> <label class="col-md-1 col-form-label form-group-animated">Colonia:</label>
<div class="col-md-5"> <div class="col-md-5 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['colonia'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['colonia'] ?? '') ?>" disabled>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">País:</label> <label class="col-md-2 col-form-label form-group-animated">País:</label>
<div class="col-md-3"> <div class="col-md-3 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['pais'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['pais'] ?? '') ?>" disabled>
</div> </div>
<div class="col-md-3"></div> <div class="col-md-3"></div>
<label class="col-md-2 col-form-label">Código Postal:</label> <label class="col-md-2 col-form-label form-group-animated">Código Postal:</label>
<div class="col-md-2"> <div class="col-md-2 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['codigo_postal'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['codigo_postal'] ?? '') ?>" disabled>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Municipio:</label> <label class="col-md-2 col-form-label form-group-animated">Municipio:</label>
<div class="col-md-4"> <div class="col-md-4 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['municipio'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['municipio'] ?? '') ?>" disabled>
</div> </div>
<div class="col-md-1"></div> <div class="col-md-1"></div>
<label class="col-md-1 col-form-label">Estado:</label> <label class="col-md-1 col-form-label form-group-animated">Estado:</label>
<div class="col-md-4"> <div class="col-md-4 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['estado'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['estado'] ?? '') ?>" disabled>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Teléfono:</label> <label class="col-md-2 col-form-label form-group-animated">Teléfono:</label>
<div class="col-md-5"> <div class="col-md-5 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['telefono'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['telefono'] ?? '') ?>" disabled>
</div> </div>
<div class="col-md-1"></div> <div class="col-md-1"></div>
<label class="col-md-1 col-form-label">Fax:</label> <label class="col-md-1 col-form-label form-group-animated">Fax:</label>
<div class="col-md-3"> <div class="col-md-3 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['fax'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['fax'] ?? '') ?>" disabled>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Correo:</label> <label class="col-md-2 col-form-label form-group-animated">Correo:</label>
<div class="col-md-10"> <div class="col-md-10 form-group-animated">
<input type="email" class="form-control" value="<?= htmlspecialchars($datos['correo'] ?? '') ?>" disabled> <input type="email" class="form-control" value="<?= htmlspecialchars($datos['correo'] ?? '') ?>" disabled>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Observaciones:</label> <label class="col-md-2 col-form-label form-group-animated">Observaciones:</label>
<div class="col-md-10"> <div class="col-md-10 form-group-animated">
<textarea class="form-control" rows="3" disabled><?= htmlspecialchars($datos['observaciones'] ?? '') ?></textarea> <textarea class="form-control" rows="3" disabled><?= htmlspecialchars($datos['observaciones'] ?? '') ?></textarea>
</div> </div>
</div> </div>
<div style="display: flex; justify-content: right;">
<div style="display: flex; justify-content: right;" class="form-group-animated">
<a href="/IMPORTADORES/configuracion/editar" class="btn btn-success mb-3 mt-auto w-auto btn-animated">✏️ Editar Información</a> <a href="/IMPORTADORES/configuracion/editar" class="btn btn-success mb-3 mt-auto w-auto btn-animated">✏️ Editar Información</a>
</div> </div>
</div>
</form> </form>
</div> </div>
<?php elseif (isset($datos['tipo_usuario']) && in_array($datos['tipo_usuario'], ['admin_agencia', 'agente_aduanal'])): ?> <?php elseif (isset($datos['tipo_usuario']) && in_array($datos['tipo_usuario'], ['admin_agencia', 'agente_aduanal'])): ?>
<div class="card shadow-sm p-4 mb-4 bg-white"> <div class="card shadow-sm p-4 mb-4 bg-white fade-in-up">
<div class="section-header">🏢 Información de Agencia Aduanal</div> <div class="section-header form-group-animated">🏢 Información de Agencia Aduanal</div>
<form> <form>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Nombre Agencia:</label> <label class="col-md-2 col-form-label form-group-animated">Nombre Agencia:</label>
<div class="col-md-10"> <div class="col-md-10 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars(decrypt($datos['nombre_agencia'] ?? '')) ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars(decrypt($datos['nombre_agencia'] ?? '')) ?>" disabled>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">RFC:</label> <label class="col-md-2 col-form-label form-group-animated">RFC:</label>
<div class="col-md-3"> <div class="col-md-3 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['rfc_agencia'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['rfc_agencia'] ?? '') ?>" disabled>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Teléfono:</label> <label class="col-md-2 col-form-label form-group-animated">Teléfono:</label>
<div class="col-md-3"> <div class="col-md-3 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['telefono_agencia'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['telefono_agencia'] ?? '') ?>" disabled>
</div> </div>
<div class="col-md-3"></div> <div class="col-md-3"></div>
<label class="col-md-1 col-form-label">Email:</label> <label class="col-md-1 col-form-label form-group-animated">Email:</label>
<div class="col-md-3"> <div class="col-md-3 form-group-animated">
<input type="email" class="form-control" value="<?= htmlspecialchars(decrypt($datos['email_agencia'] ?? '')) ?>" disabled> <input type="email" class="form-control" value="<?= htmlspecialchars(decrypt($datos['email_agencia'] ?? '')) ?>" disabled>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Dirección:</label> <label class="col-md-2 col-form-label form-group-animated">Dirección:</label>
<div class="col-md-10"> <div class="col-md-10 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['direccion_agencia'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['direccion_agencia'] ?? '') ?>" disabled>
</div> </div>
</div><hr> </div><hr>
<!-- Información personal del usuario (para referencia) --> <!-- Información personal del usuario (para referencia) -->
<div class="section-header mt-4">👤 Mi Información Personal</div> <div class="section-header mt-4 form-group-animated">👤 Mi Información Personal</div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Nombre:</label> <label class="col-md-2 col-form-label form-group-animated">Nombre:</label>
<div class="col-md-4"> <div class="col-md-4 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars(decrypt($datos['nombre'] ?? '')) ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars(decrypt($datos['nombre'] ?? '')) ?>" disabled>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Correo:</label> <label class="col-md-2 col-form-label form-group-animated">Correo:</label>
<div class="col-md-10"> <div class="col-md-10 form-group-animated">
<input type="email" class="form-control" value="<?= htmlspecialchars(decrypt($datos['correo'] ?? '')) ?>" disabled> <input type="email" class="form-control" value="<?= htmlspecialchars(decrypt($datos['correo'] ?? '')) ?>" disabled>
</div> </div>
</div> </div>
<?php if (isset($datos['fecha_asignacion']) && $datos['fecha_asignacion']): ?> <?php if (isset($datos['fecha_asignacion']) && $datos['fecha_asignacion']): ?>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Fecha de Asignación:</label> <label class="col-md-2 col-form-label form-group-animated">Fecha de Asignación:</label>
<div class="col-md-3"> <div class="col-md-3 form-group-animated">
<?php <?php
// Handle both DateTime objects and string dates // Handle both DateTime objects and string dates
if ($datos['fecha_asignacion'] instanceof DateTime) { if ($datos['fecha_asignacion'] instanceof DateTime) {
@@ -262,25 +284,25 @@
</form> </form>
</div> </div>
<?php elseif (isset($datos['tipo_usuario']) && $datos['tipo_usuario'] === 'super_admin'): ?> <?php elseif (isset($datos['tipo_usuario']) && $datos['tipo_usuario'] === 'super_admin'): ?>
<div class="card shadow-sm p-4 mb-4 bg-white"> <div class="card shadow-sm p-4 mb-4 bg-white fade-in-up">
<div class="section-header">🔧 Información del Administrador</div> <div class="section-header form-group-animated">🔧 Información del Administrador</div>
<form> <form>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-1 col-form-label">Nombre:</label> <label class="col-md-1 col-form-label form-group-animated">Nombre:</label>
<div class="col-md-4"> <div class="col-md-4 form-group-animated">
<!-- Para super_admin, NO desencriptar - usar directamente --> <!-- Para super_admin, NO desencriptar - usar directamente -->
<input type="text" class="form-control" value="<?= htmlspecialchars(decrypt($datos['nombre'] ?? '')) ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars(decrypt($datos['nombre'] ?? '')) ?>" disabled>
</div> </div>
<div class="col-md-3"></div> <div class="col-md-3"></div>
<label class="col-md-1 col-form-label">Tipo de Usuario:</label> <label class="col-md-1 col-form-label form-group-animated">Tipo de Usuario:</label>
<div class="col-md-3"> <div class="col-md-3 form-group-animated">
<input type="text" class="form-control" value="Super Administrador" disabled> <input type="text" class="form-control" value="Super Administrador" disabled>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-1 col-form-label">Correo:</label> <label class="col-md-1 col-form-label form-group-animated">Correo:</label>
<div class="col-md-11"> <div class="col-md-11 form-group-animated">
<!-- Para super_admin, NO desencriptar - usar directamente --> <!-- Para super_admin, NO desencriptar - usar directamente -->
<input type="email" class="form-control" value="<?= htmlspecialchars(decrypt($datos['correo'] ?? '')) ?>" disabled> <input type="email" class="form-control" value="<?= htmlspecialchars(decrypt($datos['correo'] ?? '')) ?>" disabled>
</div> </div>
@@ -288,9 +310,9 @@
<!-- Información adicional específica de super_admin --> <!-- Información adicional específica de super_admin -->
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-1 col-form-label">Privilegios:</label> <label class="col-md-1 col-form-label form-group-animated">Privilegios:</label>
<div class="col-md-11"> <div class="col-md-11 form-group-animated">
<textarea class="form-control" rows="2" disabled>Acceso completo al sistema - Gestión de usuarios, agencias, importadores y configuración general</textarea> <textarea class="form-control" rows="2" disabled>Acceso completo al sistema - Gestión de usuarios, agencias y configuración general</textarea>
</div> </div>
</div> </div>
</form> </form>
@@ -312,5 +334,11 @@
<?php endif; ?> <?php endif; ?>
</div> </div>
<script>
<?php if (isset($_GET['updated']) && $_GET['updated'] === 'ok'): ?>
Swal.fire({ icon: 'success', title: 'Información actualizada', text: 'Los datos se modificaron correctamente.', confirmButtonColor: '#198754' });
<?php endif; ?>
</script>
</body> </body>
</html> </html>

View File

@@ -56,25 +56,48 @@
.btn-animated::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; .btn-animated::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); transition: left 0.5s; } background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); transition: left 0.5s; }
.btn-animated:hover::before { left: 100%; } .btn-animated:hover::before { left: 100%; }
label {font-weight: bold;} label {font-weight: bold; }
.error-msg { color: red; font-size: 0.9em; } .error-msg { color: red; font-size: 0.9em; }
.section-header { background-color: #e9ecef; padding: 10px 15px; margin: 0 0 20px 0; border-radius: 8px 8px 0 0; font-weight: bold; color: #495057; }
/* ========== ANIMACIONES PARA INPUTS TEXTO ========== */
.form-control:not(.no-animation) { transition: all 0.3s ease; border: 2px solid #dee2e6; position: relative; }
.form-control:not(.no-animation).shake { animation: shake 0.5s ease-in-out; }
@keyframes shake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-5px); }
75% { transform: translateX(5px); }
}
/* Animación para los campos del formulario */
.form-group-animated { opacity: 0; transform: translateY(20px); animation: slideUp 0.6s ease-out forwards; }
.form-group-animated:nth-child(1) { animation-delay: 0.1s; }
.form-group-animated:nth-child(2) { animation-delay: 0.2s; }
.form-group-animated:nth-child(3) { animation-delay: 0.3s; }
.form-group-animated:nth-child(4) { animation-delay: 0.4s; }
.form-group-animated:nth-child(5) { animation-delay: 0.5s; }
.form-group-animated:nth-child(6) { animation-delay: 0.6s; }
.form-group-animated:nth-child(7) { animation-delay: 0.7s; }
.form-group-animated:nth-child(8) { animation-delay: 0.8s; }
.form-group-animated:nth-child(9) { animation-delay: 0.9s; }
.form-group-animated:nth-child(10) { animation-delay: 1.0s; }
@keyframes slideUp { to { opacity: 1; transform: translateY(0); } }
</style> </style>
</head> </head>
<body> <body>
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✏️ Editar Información</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✏️ Editar Información</h4>
<div class="card shadow-sm p-4 mb-4 bg-white card-hover position-relative h-auto"> <div class="card shadow-sm p-4 mb-4 bg-white card-hover position-relative h-auto fade-in-up">
<div class="section-header form-group-animated">👤 Información Personal</div>
<form id="form-edicion" method="POST" action="/IMPORTADORES/configuracion/guardar"> <form id="form-edicion" method="POST" action="/IMPORTADORES/configuracion/guardar">
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Clave:</label> <label class="col-md-2 col-form-label form-group-animated">Clave:</label>
<div class="col-md-3"> <div class="col-md-3 form-group-animated">
<input type="text" name="clave" maxlength="8" class="form-control" value="<?= htmlspecialchars($datos['clave'] ?? '') ?>" disabled> <input type="text" name="clave" maxlength="8" class="form-control" value="<?= htmlspecialchars($datos['clave'] ?? '') ?>" disabled>
</div> </div>
<div class="col-md-3"></div> <div class="col-md-3"></div>
<label class="col-md-2 col-form-label">Tipo de identificador:</label> <label class="col-md-2 col-form-label form-group-animated">Tipo de identificador:</label>
<div class="col-md-2"> <div class="col-md-2 form-group-animated">
<select name="tipo_identificador" class="form-control" required> <select name="tipo_identificador" class="form-select" required>
<option value="">-- Selecciona una opción --</option> <option value="">-- Selecciona una opción --</option>
<option value="1" <?= ($datos['tipo_identificador'] ?? '') == '1' ? 'selected' : '' ?>>1 - RFC</option> <option value="1" <?= ($datos['tipo_identificador'] ?? '') == '1' ? 'selected' : '' ?>>1 - RFC</option>
<option value="2" <?= ($datos['tipo_identificador'] ?? '') == '2' ? 'selected' : '' ?>>2 - CURP</option> <option value="2" <?= ($datos['tipo_identificador'] ?? '') == '2' ? 'selected' : '' ?>>2 - CURP</option>
@@ -84,106 +107,106 @@
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Nombre:</label> <label class="col-md-2 col-form-label form-group-animated">Nombre:</label>
<div class="col-md-10"> <div class="col-md-10 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['nombre'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['nombre'] ?? '') ?>" disabled>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">RFC:</label> <label class="col-md-2 col-form-label form-group-animated">RFC:</label>
<div class="col-md-3"> <div class="col-md-3 form-group-animated">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['rfc'] ?? '') ?>" disabled> <input type="text" class="form-control" value="<?= htmlspecialchars($datos['rfc'] ?? '') ?>" disabled>
</div> </div>
<div class="col-md-1"></div> <div class="col-md-1"></div>
<label class="col-md-1 col-form-label">CURP:</label> <label class="col-md-1 col-form-label form-group-animated">CURP:</label>
<div class="col-md-5"> <div class="col-md-5 form-group-animated">
<input type="text" name="curp" maxlength="18" class="form-control" value="<?= htmlspecialchars($datos['curp'] ?? '') ?>"> <input type="text" name="curp" maxlength="18" class="form-control" value="<?= htmlspecialchars($datos['curp'] ?? '') ?>">
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Calle:</label> <label class="col-md-2 col-form-label form-group-animated">Calle:</label>
<div class="col-md-10"> <div class="col-md-10 form-group-animated">
<input type="text" name="calle" class="form-control" value="<?= htmlspecialchars($datos['calle'] ?? '') ?>"> <input type="text" name="calle" class="form-control" value="<?= htmlspecialchars($datos['calle'] ?? '') ?>">
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Núm. Exterior:</label> <label class="col-md-2 col-form-label form-group-animated">Núm. Exterior:</label>
<div class="col-md-2"> <div class="col-md-2 form-group-animated">
<input type="text" name="num_exterior" class="form-control" value="<?= htmlspecialchars($datos['num_exterior'] ?? '') ?>"> <input type="text" name="num_exterior" class="form-control" value="<?= htmlspecialchars($datos['num_exterior'] ?? '') ?>">
</div> </div>
<div class="col-md-4"></div> <div class="col-md-4"></div>
<label class="col-md-2 col-form-label">Núm. Interior:</label> <label class="col-md-2 col-form-label form-group-animated">Núm. Interior:</label>
<div class="col-md-2"> <div class="col-md-2 form-group-animated">
<input type="text" name="num_interior" class="form-control" value="<?= htmlspecialchars($datos['num_interior'] ?? '') ?>"> <input type="text" name="num_interior" class="form-control" value="<?= htmlspecialchars($datos['num_interior'] ?? '') ?>">
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Ciudad / Localidad:</label> <label class="col-md-2 col-form-label form-group-animated">Ciudad / Localidad:</label>
<div class="col-md-3"> <div class="col-md-3 form-group-animated">
<input type="text" name="ciudad" class="form-control" value="<?= htmlspecialchars($datos['ciudad'] ?? '') ?>"> <input type="text" name="ciudad" class="form-control" value="<?= htmlspecialchars($datos['ciudad'] ?? '') ?>">
</div> </div>
<div class="col-md-1"></div> <div class="col-md-1"></div>
<label class="col-md-1 col-form-label">Colonia:</label> <label class="col-md-1 col-form-label form-group-animated">Colonia:</label>
<div class="col-md-5"> <div class="col-md-5 form-group-animated">
<input type="text" name="colonia" class="form-control" value="<?= htmlspecialchars($datos['colonia'] ?? '') ?>"> <input type="text" name="colonia" class="form-control" value="<?= htmlspecialchars($datos['colonia'] ?? '') ?>">
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">País:</label> <label class="col-md-2 col-form-label form-group-animated">País:</label>
<div class="col-md-3"> <div class="col-md-3 form-group-animated">
<input type="text" name="pais" class="form-control" value="<?= htmlspecialchars($datos['pais'] ?? '') ?>"> <input type="text" name="pais" class="form-control" value="<?= htmlspecialchars($datos['pais'] ?? '') ?>">
</div> </div>
<div class="col-md-3"></div> <div class="col-md-3"></div>
<label class="col-md-2 col-form-label">Código Postal:</label> <label class="col-md-2 col-form-label form-group-animated">Código Postal:</label>
<div class="col-md-2"> <div class="col-md-2 form-group-animated">
<input type="number" name="codigo_postal" class="form-control" value="<?= htmlspecialchars($datos['codigo_postal'] ?? '') ?>"> <input type="number" name="codigo_postal" class="form-control" value="<?= htmlspecialchars($datos['codigo_postal'] ?? '') ?>">
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Municipio:</label> <label class="col-md-2 col-form-label form-group-animated">Municipio:</label>
<div class="col-md-4"> <div class="col-md-4 form-group-animated">
<input type="text" name="municipio" class="form-control" value="<?= htmlspecialchars($datos['municipio'] ?? '') ?>"> <input type="text" name="municipio" class="form-control" value="<?= htmlspecialchars($datos['municipio'] ?? '') ?>">
</div> </div>
<div class="col-md-1"></div> <div class="col-md-1"></div>
<label class="col-md-1 col-form-label">Estado:</label> <label class="col-md-1 col-form-label form-group-animated">Estado:</label>
<div class="col-md-4"> <div class="col-md-4 form-group-animated">
<input type="text" name="estado" class="form-control" value="<?= htmlspecialchars($datos['estado'] ?? '') ?>"> <input type="text" name="estado" class="form-control" value="<?= htmlspecialchars($datos['estado'] ?? '') ?>">
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Teléfono:</label> <label class="col-md-2 col-form-label form-group-animated">Teléfono:</label>
<div class="col-md-5"> <div class="col-md-5 form-group-animated">
<input type="text" name="telefono" maxlength="11" class="form-control" value="<?= htmlspecialchars($datos['telefono'] ?? '') ?>"> <input type="text" name="telefono" maxlength="11" class="form-control" value="<?= htmlspecialchars($datos['telefono'] ?? '') ?>">
</div> </div>
<div class="col-md-1"></div> <div class="col-md-1"></div>
<label class="col-md-1 col-form-label">Fax:</label> <label class="col-md-1 col-form-label form-group-animated">Fax:</label>
<div class="col-md-3"> <div class="col-md-3 form-group-animated">
<input type="text" name="fax" maxlength="12" class="form-control" value="<?= htmlspecialchars($datos['fax'] ?? '') ?>"> <input type="text" name="fax" maxlength="12" class="form-control" value="<?= htmlspecialchars($datos['fax'] ?? '') ?>">
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Correo:</label> <label class="col-md-2 col-form-label form-group-animated">Correo:</label>
<div class="col-md-10"> <div class="col-md-10 form-group-animated">
<input type="email" class="form-control" value="<?= htmlspecialchars($datos['correo'] ?? '') ?>" disabled> <input type="email" class="form-control" value="<?= htmlspecialchars($datos['correo'] ?? '') ?>" disabled>
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label class="col-md-2 col-form-label">Observaciones:</label> <label class="col-md-2 col-form-label form-group-animated">Observaciones:</label>
<div class="col-md-10"> <div class="col-md-10 form-group-animated">
<?php $valor_obs = htmlspecialchars($datos['observaciones'] ?? ''); ?> <?php $valor_obs = htmlspecialchars($datos['observaciones'] ?? ''); ?>
<textarea name="observaciones" class="form-control" rows="3"><?= $valor_obs ?></textarea> <textarea name="observaciones" class="form-control" rows="3"><?= $valor_obs ?></textarea>
</div> </div>
</div> </div>
<div style="display: flex; justify-content: right;"> <div style="display: flex; justify-content: right;" class="form-group-animated">
<a href="/IMPORTADORES/configuracion/index" class="btn btn-secondary ms-2 mt-auto w-auto btn-animated" style="margin-right: 10px;">Cancelar</a> <a href="/IMPORTADORES/configuracion/index" class="btn btn-secondary ms-2 mt-auto w-auto btn-animated" style="margin-right: 10px;">Cancelar</a>
<button type="submit" class="btn btn-primary mt-auto w-auto btn-animated">💾 Guardar Cambios</button> <button type="submit" class="btn btn-primary mt-auto w-auto btn-animated">💾 Guardar Cambios</button>
</div> </div>

View File

@@ -10,7 +10,7 @@
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script> <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<!-- Font Awesome --> <!-- Font Awesome -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css">
<!-- Animate.css para animaciones adicionales --> <!-- Animate.css para animaciones adicionales -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css">
<style> <style>
@@ -60,7 +60,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">📁 Expedientes Electrónicos</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">📁 Expedientes Electrónicos</h4>
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-hover table-bordered"> <table class="table table-hover table-bordered">
<thead class="table-dark"> <thead class="table-dark">
@@ -96,7 +96,5 @@
</div> </div>
</div> </div>
<script src="https://kit.fontawesome.com/a076d05399.js" crossorigin="anonymous"></script>
</body> </body>
</html> </html>

View File

@@ -51,14 +51,16 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">📤 Subir Archivos al Expediente</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">📤 Subir Archivos al Expediente</h4>
<div class="card p-4 bg-white shadow-sm card-hover position-relative h-auto"> <div class="card p-4 bg-white shadow-sm card-hover position-relative h-auto fade-in-up">
<form action="/IMPORTADORES/expediente/subir_handler" method="POST" enctype="multipart/form-data"> <form action="/IMPORTADORES/expediente/subir_handler" method="POST" enctype="multipart/form-data">
<input type="hidden" name="id_solicitud" value="<?= $id_solicitud ?>"> <input type="hidden" name="id_solicitud" value="<?= $id_solicitud ?>">
<div class="mb-3"> <div class="mb-3">
<label for="archivo" class="form-label">Selecciona archivo(s)</label> <label for="archivo" class="form-label">Selecciona archivo(s)</label>
<input class="form-control" type="file" name="archivos[]" id="archivo" multiple required> <input class="form-control" type="file" name="archivos[]" id="archivo" multiple required>
</div> </div>
<button type="submit" class="btn btn-success mt-auto w-auto btn-animated">Subir</button> <button type="submit" class="btn btn-success mt-auto w-auto btn-animated">Subir</button>
<a href="/IMPORTADORES/expediente/index" class="btn btn-secondary ms-2 mt-auto w-auto btn-animated">Cancelar</a> <a href="/IMPORTADORES/expediente/index" class="btn btn-secondary ms-2 mt-auto w-auto btn-animated">Cancelar</a>
</form> </form>

View File

@@ -52,7 +52,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">📂 Archivos del Expediente</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">📂 Archivos del Expediente</h4>
<div class="card p-4 bg-white shadow-sm card-hover position-relative h-auto"> <div class="card p-4 bg-white shadow-sm card-hover position-relative h-auto fade-in-up">
<?php if (empty($archivos)): ?> <?php if (empty($archivos)): ?>
<p>No hay archivos subidos para esta solicitud.</p> <p>No hay archivos subidos para esta solicitud.</p>

View File

@@ -38,6 +38,9 @@
.btn-violet { background-color: #8b5cf6; color: white; } .btn-violet { background-color: #8b5cf6; color: white; }
.text-violet { color: #8b5cf6; } .text-violet { color: #8b5cf6; }
.btn-violet:hover { background-color: #7c3aed; color: white; } .btn-violet:hover { background-color: #7c3aed; color: white; }
.btn-lila { background-color: #c4b5fd; /* violeta claro */ color: white; border: none; }
.btn-lila:hover { background-color: #a78bfa; /* tono ligeramente más fuerte */ color: white; }
.text-lila { color: #c4b5fd; }
/* A partir de dispositivos medianos (>=768px), deja espacio lateral */ /* A partir de dispositivos medianos (>=768px), deja espacio lateral */
@media (min-width: 768px) { .content { margin-left: 250px; /* Ancho del sidebar */ } } @media (min-width: 768px) { .content { margin-left: 250px; /* Ancho del sidebar */ } }
/* En móviles, sin margen lateral */ /* En móviles, sin margen lateral */

View File

@@ -119,7 +119,7 @@ if ($tipoUsuario === 'agente_aduanal') {
<!-- Nuevo Estado --> <!-- Nuevo Estado -->
<div class="col-md form-group-animated"> <div class="col-md form-group-animated">
<div class="card p-4 bg-white shadow-sm card-hover position-relative h-auto"> <div class="card p-4 bg-white shadow-sm card-hover position-relative h-auto fade-in-up">
<form id="estadoForm"> <form id="estadoForm">
<h4 class="mb-4 text-dark"> Nuevo Estado</h4><br> <h4 class="mb-4 text-dark"> Nuevo Estado</h4><br>
<!-- País --> <!-- País -->
@@ -154,7 +154,7 @@ if ($tipoUsuario === 'agente_aduanal') {
<!-- Nueva Ciudad --> <!-- Nueva Ciudad -->
<div class="col-md form-group-animated"> <div class="col-md form-group-animated">
<div class="card p-4 bg-white shadow-sm card-hover position-relative h-auto"> <div class="card p-4 bg-white shadow-sm card-hover position-relative h-auto fade-in-up">
<form id="ciudadForm" action="/IMPORTADORES/locaciones/guadarCiudad" method="POST" enctype="multipart/form-data"> <form id="ciudadForm" action="/IMPORTADORES/locaciones/guadarCiudad" method="POST" enctype="multipart/form-data">
<h4 class="mb-4 text-dark"> Nueva Ciudad</h4> <h4 class="mb-4 text-dark"> Nueva Ciudad</h4>
<!-- País --> <!-- País -->

View File

@@ -79,8 +79,8 @@ if ($tipoUsuario === 'agente_aduanal') {
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🌍 Locaciones</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🌍 Locaciones</h4>
<a href="/IMPORTADORES/locaciones/alta" class="btn btn-success mb-3 mt-auto w-auto btn-animated"> Agregar Locación</a> <a href="/IMPORTADORES/locaciones/alta" class="btn btn-success mb-3 mt-auto w-auto btn-animated fade-in-up"> Agregar Locación</a>
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped" id="tabla-locaciones"> <table class="table table-striped" id="tabla-locaciones">
<thead class="table-dark"> <thead class="table-dark">

View File

@@ -68,7 +68,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🗺️ Locaciones</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🗺️ Locaciones</h4>
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped" id="tabla-locaciones"> <table class="table table-striped" id="tabla-locaciones">
<thead class="table-dark"> <thead class="table-dark">

View File

@@ -35,6 +35,14 @@ $mensajeMantenimiento = $config['mensaje_mantenimiento'] ?? 'El sistema se encue
footer { background-color: #e9ecef; padding: 20px; text-align: center; font-size: 14px; color: #666; margin-top: 60px; } footer { background-color: #e9ecef; padding: 20px; text-align: center; font-size: 14px; color: #666; margin-top: 60px; }
#mensaje { transition: opacity 0.3s ease; } #mensaje { transition: opacity 0.3s ease; }
@media (max-height: 600px) { footer { position: static !important; } } @media (max-height: 600px) { footer { position: static !important; } }
/* Efecto de glow para elementos activos */
.btn.active { box-shadow: 0 0 20px rgba(var(--bs-primary-rgb), 0.5); }
/* Efecto para botones */
.btn-animated { transition: all 0.3s ease; position: relative; overflow: hidden; }
.btn-animated:hover { transform: translateY(-2px); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); }
.btn-animated::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); transition: left 0.5s; }
.btn-animated:hover::before { left: 100%; }
</style> </style>
</head> </head>
<body> <body>
@@ -86,7 +94,7 @@ $mensajeMantenimiento = $config['mensaje_mantenimiento'] ?? 'El sistema se encue
<input type="password" name="password" class="form-control" required autocomplete="current-password" value=""> <input type="password" name="password" class="form-control" required autocomplete="current-password" value="">
</div> </div>
<div class="d-grid"> <div class="d-grid">
<button type="submit" class="btn btn-primary">Iniciar sesión</button> <button type="submit" class="btn btn-primary btn-sm mt-auto m-100 btn-animated">Iniciar sesión</button>
</div> </div>
<div class="mb-3 text-end"> <div class="mb-3 text-end">
<div style="display: flex; justify-content: center;"> <div style="display: flex; justify-content: center;">
@@ -108,6 +116,7 @@ $mensajeMantenimiento = $config['mensaje_mantenimiento'] ?? 'El sistema se encue
<footer class="fixed-bottom"> <footer class="fixed-bottom">
&copy; <?= date('Y') ?> <?= htmlspecialchars($siglas) ?> · <?= htmlspecialchars($nombre) ?> &copy; <?= date('Y') ?> <?= htmlspecialchars($siglas) ?> · <?= htmlspecialchars($nombre) ?>
</footer> </footer>
<!-- I.C.M -->
</body> </body>
</html> </html>

View File

@@ -152,7 +152,7 @@
</li> </li>
<!-- CONFIGURACIÓN --> <!-- CONFIGURACIÓN -->
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/administrador/configuracion" class="nav-link"> <a href="/IMPORTADORES/configuracion" class="nav-link">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M5 5V.13a2.96 2.96 0 0 0-1.293.749L.879 3.707A2.96 2.96 0 0 0 .13 5H5Z"/> <path d="M5 5V.13a2.96 2.96 0 0 0-1.293.749L.879 3.707A2.96 2.96 0 0 0 .13 5H5Z"/>
<path d="M6.737 11.061a2.961 2.961 0 0 1 .81-1.515l6.117-6.116A4.839 4.839 0 0 1 16 2.141V2a1.97 1.97 0 0 0-1.933-2H7v5a2 2 0 0 1-2 2H0v11a1.969 1.969 0 0 0 1.933 2h12.134A1.97 1.97 0 0 0 16 18v-3.093l-1.546 1.546c-.413.413-.94.695-1.513.81l-3.4.679a2.947 2.947 0 0 1-1.85-.227 2.96 2.96 0 0 1-1.635-3.257l.681-3.397Z"/> <path d="M6.737 11.061a2.961 2.961 0 0 1 .81-1.515l6.117-6.116A4.839 4.839 0 0 1 16 2.141V2a1.97 1.97 0 0 0-1.933-2H7v5a2 2 0 0 1-2 2H0v11a1.969 1.969 0 0 0 1.933 2h12.134A1.97 1.97 0 0 0 16 18v-3.093l-1.546 1.546c-.413.413-.94.695-1.513.81l-3.4.679a2.947 2.947 0 0 1-1.85-.227 2.96 2.96 0 0 1-1.635-3.257l.681-3.397Z"/>
@@ -248,7 +248,7 @@
</li> </li>
<!-- CONFIGURACIÓN --> <!-- CONFIGURACIÓN -->
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/administrador/configuracion" class="nav-link"> <a href="/IMPORTADORES/configuracion" class="nav-link">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M5 5V.13a2.96 2.96 0 0 0-1.293.749L.879 3.707A2.96 2.96 0 0 0 .13 5H5Z"/> <path d="M5 5V.13a2.96 2.96 0 0 0-1.293.749L.879 3.707A2.96 2.96 0 0 0 .13 5H5Z"/>
<path d="M6.737 11.061a2.961 2.961 0 0 1 .81-1.515l6.117-6.116A4.839 4.839 0 0 1 16 2.141V2a1.97 1.97 0 0 0-1.933-2H7v5a2 2 0 0 1-2 2H0v11a1.969 1.969 0 0 0 1.933 2h12.134A1.97 1.97 0 0 0 16 18v-3.093l-1.546 1.546c-.413.413-.94.695-1.513.81l-3.4.679a2.947 2.947 0 0 1-1.85-.227 2.96 2.96 0 0 1-1.635-3.257l.681-3.397Z"/> <path d="M6.737 11.061a2.961 2.961 0 0 1 .81-1.515l6.117-6.116A4.839 4.839 0 0 1 16 2.141V2a1.97 1.97 0 0 0-1.933-2H7v5a2 2 0 0 1-2 2H0v11a1.969 1.969 0 0 0 1.933 2h12.134A1.97 1.97 0 0 0 16 18v-3.093l-1.546 1.546c-.413.413-.94.695-1.513.81l-3.4.679a2.947 2.947 0 0 1-1.85-.227 2.96 2.96 0 0 1-1.635-3.257l.681-3.397Z"/>
@@ -270,9 +270,13 @@
const logoutBtn = document.getElementById('logout-btn'); const logoutBtn = document.getElementById('logout-btn');
if (!esDashboard) { if (!esDashboard) {
if (welcomeText) {
welcomeText.style.display = 'none'; welcomeText.style.display = 'none';
}
if (logoutBtn) {
logoutBtn.style.display = 'inline-block'; logoutBtn.style.display = 'inline-block';
} }
}
// Manejar estados activos basados en URL actual // Manejar estados activos basados en URL actual
const currentPath = window.location.pathname; const currentPath = window.location.pathname;

View File

@@ -59,7 +59,7 @@
<div class="navbar-content"> <div class="navbar-content">
<?php <?php
// Verifica si estás en el dashboard principal del importador // Verifica si estás en el dashboard principal del importador
$esDashboard = str_contains($_SERVER['REQUEST_URI'], '/agencias/dashboard'); $esDashboard = str_contains($_SERVER['REQUEST_URI'], '/IMPORTADORES/agencias/dashboard');
if ($esDashboard): ?> if ($esDashboard): ?>
<span id="welcome-text">Bienvenido, <?= htmlspecialchars($_SESSION['usuario_nombre']) ?></span> <span id="welcome-text">Bienvenido, <?= htmlspecialchars($_SESSION['usuario_nombre']) ?></span>
@@ -107,7 +107,7 @@
</li> </li>
<!-- Patentes --> <!-- Patentes -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuPatentes" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuPatentesDesktop" role="button" aria-expanded="false" aria-controls="submenuPatentesDesktop">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z" clip-rule="evenodd"/> <path fill-rule="evenodd" d="M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z" clip-rule="evenodd"/>
</svg> </svg>
@@ -116,7 +116,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuPatentes"> <div class="collapse" id="submenuPatentesDesktop">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/patente/lista" class="nav-link"> <a href="/IMPORTADORES/patente/lista" class="nav-link">
@@ -133,7 +133,7 @@
</li> </li>
<!-- LOCACIONES --> <!-- LOCACIONES -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuLocaciones" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuLocacionesDesktop" role="button" aria-expanded="false" aria-controls="submenuLocacionesDesktop">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M10 2C6.686 2 4 4.686 4 8c0 5.25 6 12 6 12s6-6.75 6-12c0-3.314-2.686-6-6-6zm0 8c-1.105 0-2-.895-2-2s.895-2 2-2 2 .895 2 2-.895 2-2 2z"/> <path d="M10 2C6.686 2 4 4.686 4 8c0 5.25 6 12 6 12s6-6.75 6-12c0-3.314-2.686-6-6-6zm0 8c-1.105 0-2-.895-2-2s.895-2 2-2 2 .895 2 2-.895 2-2 2z"/>
</svg> </svg>
@@ -142,7 +142,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuLocaciones"> <div class="collapse" id="submenuLocacionesDesktop">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/locaciones/lista" class="nav-link"> <a href="/IMPORTADORES/locaciones/lista" class="nav-link">
@@ -221,7 +221,7 @@
</li> </li>
<!-- Patentes --> <!-- Patentes -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuPatentes" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuPatentesMobile" role="button" aria-expanded="false" aria-controls="submenuPatentesMobile">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z" clip-rule="evenodd"/> <path fill-rule="evenodd" d="M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z" clip-rule="evenodd"/>
</svg> </svg>
@@ -230,7 +230,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuPatentes"> <div class="collapse" id="submenuPatentesMobile">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/patente/lista" class="nav-link"> <a href="/IMPORTADORES/patente/lista" class="nav-link">
@@ -247,7 +247,7 @@
</li> </li>
<!-- LOCACIONES --> <!-- LOCACIONES -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuLocaciones" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuLocacionesMobile" role="button" aria-expanded="false" aria-controls="submenuLocacionesMobile">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M10 2C6.686 2 4 4.686 4 8c0 5.25 6 12 6 12s6-6.75 6-12c0-3.314-2.686-6-6-6zm0 8c-1.105 0-2-.895-2-2s.895-2 2-2 2 .895 2 2-.895 2-2 2z"/> <path d="M10 2C6.686 2 4 4.686 4 8c0 5.25 6 12 6 12s6-6.75 6-12c0-3.314-2.686-6-6-6zm0 8c-1.105 0-2-.895-2-2s.895-2 2-2 2 .895 2 2-.895 2-2 2z"/>
</svg> </svg>
@@ -256,7 +256,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuLocaciones"> <div class="collapse" id="submenuLocacionesMobile">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/locaciones/lista" class="nav-link"> <a href="/IMPORTADORES/locaciones/lista" class="nav-link">
@@ -299,14 +299,18 @@
<script> <script>
// Simular lógica de dashboard // Simular lógica de dashboard
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
const esDashboard = window.location.pathname.includes('/administrador/dashboard'); const esDashboard = window.location.pathname.includes('/agencias/dashboard');
const welcomeText = document.getElementById('welcome-text'); const welcomeText = document.getElementById('welcome-text');
const logoutBtn = document.getElementById('logout-btn'); const logoutBtn = document.getElementById('logout-btn');
if (!esDashboard) { if (!esDashboard) {
if (welcomeText) {
welcomeText.style.display = 'none'; welcomeText.style.display = 'none';
}
if (logoutBtn) {
logoutBtn.style.display = 'inline-block'; logoutBtn.style.display = 'inline-block';
} }
}
// Manejar estados activos basados en URL actual // Manejar estados activos basados en URL actual
const currentPath = window.location.pathname; const currentPath = window.location.pathname;
@@ -319,31 +323,66 @@
} }
}); });
// Manejar collapse manualmente
document.querySelectorAll('[data-bs-toggle="collapse"]').forEach(trigger => { document.querySelectorAll('[data-bs-toggle="collapse"]').forEach(trigger => {
// Desactivar Bootstrap
trigger.removeAttribute('data-bs-toggle');
// Inicializar estado correcto
const target = document.querySelector(trigger.getAttribute('href'));
if (target) {
target.style.transition = 'height 0.3s ease, opacity 0.2s ease';
target.style.overflow = 'hidden';
if (!target.classList.contains('show')) {
target.style.height = '0';
target.style.opacity = '0';
}
}
trigger.addEventListener('click', function(e) { trigger.addEventListener('click', function(e) {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); const target = document.querySelector(this.getAttribute('href'));
const icon = this.querySelector('.collapse-icon');
const targetId = this.getAttribute('href'); if (!target) return;
const targetElement = document.querySelector(targetId);
const isExpanded = this.getAttribute('aria-expanded') === 'true';
if (targetElement) { const isExpanding = this.getAttribute('aria-expanded') !== 'true';
if (isExpanded) {
// Cerrar if (isExpanding) {
targetElement.classList.remove('show');
this.setAttribute('aria-expanded', 'false');
} else {
// Abrir // Abrir
targetElement.classList.add('show'); target.classList.add('show');
target.style.height = '0';
target.style.opacity = '0';
target.style.display = 'block';
// Forzar reflow
void target.offsetHeight;
target.style.height = target.scrollHeight + 'px';
target.style.opacity = '1';
this.setAttribute('aria-expanded', 'true'); this.setAttribute('aria-expanded', 'true');
} if (icon) icon.style.transform = 'rotate(180deg)';
} else {
// Cerrar
target.style.height = target.scrollHeight + 'px';
target.style.opacity = '1';
// Forzar reflow
void target.offsetHeight;
target.style.height = '0';
target.style.opacity = '0';
setTimeout(() => {
target.classList.remove('show');
target.style.display = '';
}, 300);
this.setAttribute('aria-expanded', 'false');
if (icon) icon.style.transform = 'rotate(0deg)';
} }
}); });
// Remover el atributo data-bs-toggle para evitar conflictos
trigger.removeAttribute('data-bs-toggle');
}); });
}); });
</script> </script>

View File

@@ -98,7 +98,7 @@
</li> </li>
<!-- Patentes --> <!-- Patentes -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuPatentes" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuPatentesDesktop" role="button" aria-expanded="false" aria-controls="submenuPatentesDesktop">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z" clip-rule="evenodd"/> <path fill-rule="evenodd" d="M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z" clip-rule="evenodd"/>
</svg> </svg>
@@ -107,7 +107,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuPatentes"> <div class="collapse" id="submenuPatentesDesktop">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/patente/lista" class="nav-link"> <a href="/IMPORTADORES/patente/lista" class="nav-link">
@@ -124,7 +124,7 @@
</li> </li>
<!-- LOCACIONES --> <!-- LOCACIONES -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuLocaciones" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuLocacionesDesktop" role="button" aria-expanded="false" aria-controls="submenuLocacionesDesktop">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M10 2C6.686 2 4 4.686 4 8c0 5.25 6 12 6 12s6-6.75 6-12c0-3.314-2.686-6-6-6zm0 8c-1.105 0-2-.895-2-2s.895-2 2-2 2 .895 2 2-.895 2-2 2z"/> <path d="M10 2C6.686 2 4 4.686 4 8c0 5.25 6 12 6 12s6-6.75 6-12c0-3.314-2.686-6-6-6zm0 8c-1.105 0-2-.895-2-2s.895-2 2-2 2 .895 2 2-.895 2-2 2z"/>
</svg> </svg>
@@ -133,7 +133,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuLocaciones"> <div class="collapse" id="submenuLocacionesDesktop">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/locaciones/lista" class="nav-link"> <a href="/IMPORTADORES/locaciones/lista" class="nav-link">
@@ -194,7 +194,7 @@
</li> </li>
<!-- Patentes --> <!-- Patentes -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuPatentes" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuPatentesMobile" role="button" aria-expanded="false" aria-controls="submenuPatentesMobile">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z" clip-rule="evenodd"/> <path fill-rule="evenodd" d="M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z" clip-rule="evenodd"/>
</svg> </svg>
@@ -203,7 +203,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuPatentes"> <div class="collapse" id="submenuPatentesMobile">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/patente/lista" class="nav-link"> <a href="/IMPORTADORES/patente/lista" class="nav-link">
@@ -220,7 +220,7 @@
</li> </li>
<!-- LOCACIONES --> <!-- LOCACIONES -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuLocaciones" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuLocacionesMobile" role="button" aria-expanded="false" aria-controls="submenuLocacionesMobile">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M10 2C6.686 2 4 4.686 4 8c0 5.25 6 12 6 12s6-6.75 6-12c0-3.314-2.686-6-6-6zm0 8c-1.105 0-2-.895-2-2s.895-2 2-2 2 .895 2 2-.895 2-2 2z"/> <path d="M10 2C6.686 2 4 4.686 4 8c0 5.25 6 12 6 12s6-6.75 6-12c0-3.314-2.686-6-6-6zm0 8c-1.105 0-2-.895-2-2s.895-2 2-2 2 .895 2 2-.895 2-2 2z"/>
</svg> </svg>
@@ -229,7 +229,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuLocaciones"> <div class="collapse" id="submenuLocacionesMobile">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/locaciones/lista" class="nav-link"> <a href="/IMPORTADORES/locaciones/lista" class="nav-link">
@@ -263,14 +263,18 @@
<script> <script>
// Simular lógica de dashboard // Simular lógica de dashboard
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
const esDashboard = window.location.pathname.includes('/administrador/dashboard'); const esDashboard = window.location.pathname.includes('/agentes/dashboard');
const welcomeText = document.getElementById('welcome-text'); const welcomeText = document.getElementById('welcome-text');
const logoutBtn = document.getElementById('logout-btn'); const logoutBtn = document.getElementById('logout-btn');
if (!esDashboard) { if (!esDashboard) {
if (welcomeText) {
welcomeText.style.display = 'none'; welcomeText.style.display = 'none';
}
if (logoutBtn) {
logoutBtn.style.display = 'inline-block'; logoutBtn.style.display = 'inline-block';
} }
}
// Manejar estados activos basados en URL actual // Manejar estados activos basados en URL actual
const currentPath = window.location.pathname; const currentPath = window.location.pathname;

View File

@@ -177,6 +177,17 @@ function obtenerUrlPermiso($permiso) {
.permission-scope { font-size: 0.65rem; color: #6c757d; margin-left: 5px; padding: 1px 4px; background-color: rgba(108, 117, 125, 0.1); border-radius: 2px; } .permission-scope { font-size: 0.65rem; color: #6c757d; margin-left: 5px; padding: 1px 4px; background-color: rgba(108, 117, 125, 0.1); border-radius: 2px; }
.submenu-item { font-size: 0.9rem; padding-left: 1rem !important; } .submenu-item { font-size: 0.9rem; padding-left: 1rem !important; }
.submenu-item:hover { background-color: rgba(73, 80, 87, 0.7) !important; } .submenu-item:hover { background-color: rgba(73, 80, 87, 0.7) !important; }
/* Transiciones para collapse manual */
.collapse {
overflow: hidden;
transition: height 0.3s ease;
}
/* Estilo para íconos */
.collapse-icon {
transition: transform 0.3s ease;
margin-left: auto;
}
</style> </style>
<!-- NAVBAR --> <!-- NAVBAR -->
@@ -241,9 +252,9 @@ function obtenerUrlPermiso($permiso) {
<?php if ($permisosUsuario['preferencias']): ?> <?php if ($permisosUsuario['preferencias']): ?>
<?php $enDashboardPreferencias = $_SERVER['REQUEST_URI'] === '/IMPORTADORES/preferencias/index'; ?> <?php $enDashboardPreferencias = $_SERVER['REQUEST_URI'] === '/IMPORTADORES/preferencias/index'; ?>
<a class="nav-link <?= $esVistaPreferencias ? 'active' : '' ?>" <a class="nav-link <?= $esVistaPreferencias ? 'active' : '' ?>"
href="<?= $enDashboardPreferencias ? '#submenuPreferencias' : '/IMPORTADORES/preferencias/index' ?>" href="<?= $enDashboardPreferencias ? '#submenuPreferenciasDesktop' : '/IMPORTADORES/preferencias/index' ?>"
<?= $enDashboardPreferencias ? 'data-bs-toggle="collapse"' : '' ?> <?= $enDashboardPreferencias ? 'data-bs-toggle="collapse"' : '' ?>
role="button" aria-expanded="false" aria-controls="submenuPreferencias" role="button" aria-expanded="false" aria-controls="submenuPreferenciasDesktop"
onclick="<?= $enDashboardPreferencias ? 'return true;' : 'event.preventDefault(); window.location.href = \'/IMPORTADORES/preferencias/index\';' ?>"> onclick="<?= $enDashboardPreferencias ? 'return true;' : 'event.preventDefault(); window.location.href = \'/IMPORTADORES/preferencias/index\';' ?>">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M11.3 1.046a1 1 0 00-2.6 0L7.528 3H4a1 1 0 000 2h1v10H4a1 1 0 000 2h3.528l1.172 1.954a1 1 0 001.6 0L12.472 17H16a1 1 0 000-2h-1V5h1a1 1 0 100-2h-3.528L11.3 1.046zM9 6a1 1 0 011 1v6a1 1 0 11-2 0V7a1 1 0 011-1z" clip-rule="evenodd"/> <path fill-rule="evenodd" d="M11.3 1.046a1 1 0 00-2.6 0L7.528 3H4a1 1 0 000 2h1v10H4a1 1 0 000 2h3.528l1.172 1.954a1 1 0 001.6 0L12.472 17H16a1 1 0 000-2h-1V5h1a1 1 0 100-2h-3.528L11.3 1.046zM9 6a1 1 0 011 1v6a1 1 0 11-2 0V7a1 1 0 011-1z" clip-rule="evenodd"/>
@@ -253,7 +264,7 @@ function obtenerUrlPermiso($permiso) {
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuPreferencias"> <div class="collapse" id="submenuPreferenciasDesktop">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/preferencias/notificaciones" class="nav-link"> <a href="/IMPORTADORES/preferencias/notificaciones" class="nav-link">
@@ -274,9 +285,9 @@ function obtenerUrlPermiso($permiso) {
<?php if ($permisosUsuario['seguridad']): ?> <?php if ($permisosUsuario['seguridad']): ?>
<?php $enDashboardSeguridad = $_SERVER['REQUEST_URI'] === '/IMPORTADORES/seguridad/index'; ?> <?php $enDashboardSeguridad = $_SERVER['REQUEST_URI'] === '/IMPORTADORES/seguridad/index'; ?>
<a class="nav-link <?= $esVistaSeguridad ? 'active' : '' ?>" <a class="nav-link <?= $esVistaSeguridad ? 'active' : '' ?>"
href="<?= $enDashboardSeguridad ? '#submenuSeguridad' : '/IMPORTADORES/seguridad/index' ?>" href="<?= $enDashboardSeguridad ? '#submenuSeguridadDesktop' : '/IMPORTADORES/seguridad/index' ?>"
<?= $enDashboardSeguridad ? 'data-bs-toggle="collapse"' : '' ?> <?= $enDashboardSeguridad ? 'data-bs-toggle="collapse"' : '' ?>
role="button" aria-expanded="false" aria-controls="submenuSeguridad" role="button" aria-expanded="false" aria-controls="submenuSeguridadDesktop"
onclick="<?= $enDashboardSeguridad ? 'return true;' : 'event.preventDefault(); window.location.href = \'/IMPORTADORES/seguridad/index\';' ?>"> onclick="<?= $enDashboardSeguridad ? 'return true;' : 'event.preventDefault(); window.location.href = \'/IMPORTADORES/seguridad/index\';' ?>">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10 2a4 4 0 00-4 4v2H5a2 2 0 00-2 2v6a2 2 0 002 2h10a2 2 0 002-2v-6a2 2 0 00-2-2h-1V6a4 4 0 00-4-4zm2 6V6a2 2 0 10-4 0v2h4z" clip-rule="evenodd"/> <path fill-rule="evenodd" d="M10 2a4 4 0 00-4 4v2H5a2 2 0 00-2 2v6a2 2 0 002 2h10a2 2 0 002-2v-6a2 2 0 00-2-2h-1V6a4 4 0 00-4-4zm2 6V6a2 2 0 10-4 0v2h4z" clip-rule="evenodd"/>
@@ -286,7 +297,7 @@ function obtenerUrlPermiso($permiso) {
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuSeguridad"> <div class="collapse" id="submenuSeguridadDesktop">
<nav class="nav flex-column submenu"> <nav class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/seguridad/opciones" class="nav-link"> <a href="/IMPORTADORES/seguridad/opciones" class="nav-link">
@@ -302,9 +313,9 @@ function obtenerUrlPermiso($permiso) {
<?php if (tieneAccesoBitacoras($permisosBitacoras)): ?> <?php if (tieneAccesoBitacoras($permisosBitacoras)): ?>
<?php $enDashboardBitacoras = $_SERVER['REQUEST_URI'] === '/IMPORTADORES/bitacoras/index'; ?> <?php $enDashboardBitacoras = $_SERVER['REQUEST_URI'] === '/IMPORTADORES/bitacoras/index'; ?>
<a class="nav-link <?= $esVistaBitacoras ? 'active' : '' ?>" <a class="nav-link <?= $esVistaBitacoras ? 'active' : '' ?>"
href="<?= $enDashboardBitacoras ? '#submenuBitacoras' : '/IMPORTADORES/bitacoras/index' ?>" href="<?= $enDashboardBitacoras ? '#submenuBitacorasDesktop' : '/IMPORTADORES/bitacoras/index' ?>"
<?= $enDashboardBitacoras ? 'data-bs-toggle="collapse"' : '' ?> <?= $enDashboardBitacoras ? 'data-bs-toggle="collapse"' : '' ?>
role="button" aria-expanded="<?= $enDashboardBitacoras ? 'false' : 'false' ?>" aria-controls="submenuBitacoras" role="button" aria-expanded="<?= $enDashboardBitacoras ? 'false' : 'false' ?>" aria-controls="submenuBitacorasDesktop"
onclick="<?= $enDashboardBitacoras ? 'return true;' : 'event.preventDefault(); window.location.href = \'/IMPORTADORES/bitacoras/index\';' ?>"> onclick="<?= $enDashboardBitacoras ? 'return true;' : 'event.preventDefault(); window.location.href = \'/IMPORTADORES/bitacoras/index\';' ?>">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a1 1 0 001-1V4a1 1 0 00-1-1H4zm0 2h11v10H4V5z"/> <path d="M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a1 1 0 001-1V4a1 1 0 00-1-1H4zm0 2h11v10H4V5z"/>
@@ -315,7 +326,7 @@ function obtenerUrlPermiso($permiso) {
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuBitacoras"> <div class="collapse" id="submenuBitacorasDesktop">
<nav class="nav flex-column submenu"> <nav class="nav flex-column submenu">
<?php foreach ($permisosBitacoras as $permiso => $tienePermiso): ?> <?php foreach ($permisosBitacoras as $permiso => $tienePermiso): ?>
<li class="nav-item"> <li class="nav-item">
@@ -369,7 +380,148 @@ function obtenerUrlPermiso($permiso) {
<div class="offcanvas-body"> <div class="offcanvas-body">
<nav class="sidebar-nav"> <nav class="sidebar-nav">
<ul class="nav flex-column"> <ul class="nav flex-column">
<!-- INFORMACIÓN GENERAL -->
<li class="nav-item">
<?php if ($permisosUsuario['informacion_general']): ?>
<a href="/IMPORTADORES/configuracion/index" class="nav-link">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M18 10c0 4.418-3.582 8-8 8s-8-3.582-8-8 3.582-8 8-8 8 3.582 8 8zm-8-4a1 1 0 100 2 1 1 0 000-2zm-1 4a1 1 0 000 2h1v3a1 1 0 102 0v-4a1 1 0 00-1-1h-2z" clip-rule="evenodd" />
</svg>
<span>Información general</span>
</a>
<?php endif; ?>
</li>
<!-- AUTOMATIZACIONES -->
<li class="nav-item">
<?php if ($permisosUsuario['automatizaciones']): ?>
<a href="/IMPORTADORES/automatizaciones/index" class="nav-link">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M13 7H7v6h6V7z" />
<path fill-rule="evenodd" d="M5 3a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2V9.586a1 1 0 00-.293-.707l-4.586-4.586A1 1 0 0012.414 4H5zm7 1.414L16.586 10H13a1 1 0 01-1-1V4.414z" clip-rule="evenodd"/>
</svg>
<span>Automatizaciones</span>
</a>
<?php endif; ?>
</li>
<!-- PREFERENCIAS -->
<li class="nav-item">
<?php if ($permisosUsuario['preferencias']): ?>
<?php $enDashboardPreferencias = $_SERVER['REQUEST_URI'] === '/IMPORTADORES/preferencias/index'; ?>
<a class="nav-link <?= $esVistaPreferencias ? 'active' : '' ?>"
href="<?= $enDashboardPreferencias ? '#submenuPreferenciasMobile' : '/IMPORTADORES/preferencias/index' ?>"
<?= $enDashboardPreferencias ? 'data-bs-toggle="collapse"' : '' ?>
role="button" aria-expanded="false" aria-controls="submenuPreferenciasMobile"
onclick="<?= $enDashboardPreferencias ? 'return true;' : 'event.preventDefault(); window.location.href = \'/IMPORTADORES/preferencias/index\';' ?>">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M11.3 1.046a1 1 0 00-2.6 0L7.528 3H4a1 1 0 000 2h1v10H4a1 1 0 000 2h3.528l1.172 1.954a1 1 0 001.6 0L12.472 17H16a1 1 0 000-2h-1V5h1a1 1 0 100-2h-3.528L11.3 1.046zM9 6a1 1 0 011 1v6a1 1 0 11-2 0V7a1 1 0 011-1z" clip-rule="evenodd"/>
</svg>
<span>Preferencias</span>
<svg class="collapse-icon" fill="none" stroke="currentColor" viewBox="0 0 10 6">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg>
</a>
<div class="collapse" id="submenuPreferenciasMobile">
<ul class="nav flex-column submenu">
<li class="nav-item">
<a href="/IMPORTADORES/preferencias/notificaciones" class="nav-link">
Gestión de Notificaciones
</a>
</li>
<li class="nav-item">
<a href="/IMPORTADORES/preferencias/catalogos" class="nav-link">
Visualización de Catálogos
</a>
</li>
</ul>
</div>
<?php endif; ?>
</li>
<!-- SEGURIDAD -->
<li class="nav-item">
<?php if ($permisosUsuario['seguridad']): ?>
<?php $enDashboardSeguridad = $_SERVER['REQUEST_URI'] === '/IMPORTADORES/seguridad/index'; ?>
<a class="nav-link <?= $esVistaSeguridad ? 'active' : '' ?>"
href="<?= $enDashboardSeguridad ? '#submenuSeguridadMobile' : '/IMPORTADORES/seguridad/index' ?>"
<?= $enDashboardSeguridad ? 'data-bs-toggle="collapse"' : '' ?>
role="button" aria-expanded="false" aria-controls="submenuSeguridadMobile"
onclick="<?= $enDashboardSeguridad ? 'return true;' : 'event.preventDefault(); window.location.href = \'/IMPORTADORES/seguridad/index\';' ?>">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10 2a4 4 0 00-4 4v2H5a2 2 0 00-2 2v6a2 2 0 002 2h10a2 2 0 002-2v-6a2 2 0 00-2-2h-1V6a4 4 0 00-4-4zm2 6V6a2 2 0 10-4 0v2h4z" clip-rule="evenodd"/>
</svg>
<span>Seguridad</span>
<svg class="collapse-icon" fill="none" stroke="currentColor" viewBox="0 0 10 6">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg>
</a>
<div class="collapse" id="submenuSeguridadMobile">
<nav class="nav flex-column submenu">
<li class="nav-item">
<a href="/IMPORTADORES/seguridad/opciones" class="nav-link">
Opciones de Seguridad
</a>
</li>
</nav>
</div>
<?php endif; ?>
</li>
<!-- BITÁCORAS CON PERMISOS ESPECÍFICOS -->
<li class="nav-item">
<?php if (tieneAccesoBitacoras($permisosBitacoras)): ?>
<?php $enDashboardBitacoras = $_SERVER['REQUEST_URI'] === '/IMPORTADORES/bitacoras/index'; ?>
<a class="nav-link <?= $esVistaBitacoras ? 'active' : '' ?>"
href="<?= $enDashboardBitacoras ? '#submenuBitacorasMobile' : '/IMPORTADORES/bitacoras/index' ?>"
<?= $enDashboardBitacoras ? 'data-bs-toggle="collapse"' : '' ?>
role="button" aria-expanded="<?= $enDashboardBitacoras ? 'false' : 'false' ?>" aria-controls="submenuBitacorasMobile"
onclick="<?= $enDashboardBitacoras ? 'return true;' : 'event.preventDefault(); window.location.href = \'/IMPORTADORES/bitacoras/index\';' ?>">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a1 1 0 001-1V4a1 1 0 00-1-1H4zm0 2h11v10H4V5z"/>
<path d="M6 7h5v1H6V7zm0 3h8v1H6v-1z"/>
</svg>
<span>Bitácoras</span>
<svg class="collapse-icon" fill="none" stroke="currentColor" viewBox="0 0 10 6">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg>
</a>
<div class="collapse" id="submenuBitacorasMobile">
<nav class="nav flex-column submenu">
<?php foreach ($permisosBitacoras as $permiso => $tienePermiso): ?>
<li class="nav-item">
<?php if ($tienePermiso): ?>
<?php
$url = obtenerUrlPermiso($permiso);
$texto = obtenerTextoPermiso($permiso, $tipoUsuario);
$esActivo = $_SERVER['REQUEST_URI'] === $url;
// Scope según dashboard
$scope = '';
if ($tipoUsuario === 'super_admin') {
$scope = 'Global';
} elseif ($tipoUsuario === 'admin_agencia' || $tipoUsuario === 'agente_aduanal') {
if (in_array($permiso, ['acceso_usuarios_agencia', 'registro_vinculaciones'])) {
$scope = 'Agencia';
} elseif (in_array($permiso, ['mis_vinculaciones', 'mi_actividad'])) {
$scope = 'Personal';
}
} elseif ($tipoUsuario === 'importador') {
$scope = 'Personal';
}
?>
<a href="<?= $url ?>"
class="nav-link submenu-item <?= $esActivo ? 'active' : '' ?>">
<span>
<?= htmlspecialchars($texto) ?>
<?php if ($scope): ?>
<span class="permission-scope"><?= $scope ?></span>
<?php endif; ?>
</span>
</a>
<?php endif; ?>
</li>
<?php endforeach; ?>
</nav>
</div>
<?php endif; ?>
</li>
</ul> </ul>
</nav> </nav>
</div> </div>
@@ -378,55 +530,65 @@ function obtenerUrlPermiso($permiso) {
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script> <script>
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
// Detectar la ruta actual const currentPath = window.location.pathname.replace(/\/$/, '');
const currentPath = window.location.pathname;
// Función para abrir collapse si la página actual está en esa sección // Inicializar todos los collapses
function inicializarCollapses() { document.querySelectorAll('[data-bs-toggle="collapse"]').forEach(trigger => {
// Preferencias const targetId = trigger.getAttribute('data-bs-target') || trigger.getAttribute('href');
if (currentPath.includes('/preferencias/')) { const target = document.querySelector(targetId);
const preferencesCollapse = document.getElementById('submenuPreferencias'); const icon = trigger.querySelector('.collapse-icon');
if (preferencesCollapse) {
preferencesCollapse.classList.add('show'); if (!target) return;
const trigger = document.querySelector('[aria-controls="submenuPreferencias"]');
if (trigger) trigger.setAttribute('aria-expanded', 'true'); // 1. Inicialización automática basada en la ruta
} const shouldExpand = Array.from(target.querySelectorAll('a')).some(link => {
const href = link.getAttribute('href')?.replace(/\/$/, '');
return href && currentPath.startsWith(href);
});
// 2. Configurar el estado inicial
if (shouldExpand) {
target.classList.add('show');
trigger.setAttribute('aria-expanded', 'true');
if (icon) icon.style.transform = 'rotate(180deg)';
} }
// Seguridad // 3. Manejar clicks manuales
if (currentPath.includes('/seguridad/')) { trigger.addEventListener('click', function(e) {
const securityCollapse = document.getElementById('submenuSeguridad'); // Solo prevenir el comportamiento por defecto si es necesario
if (securityCollapse) { if (this.getAttribute('href') === '#' || this.getAttribute('data-bs-target') === '#') {
securityCollapse.classList.add('show'); e.preventDefault();
const trigger = document.querySelector('[aria-controls="submenuSeguridad"]');
if (trigger) trigger.setAttribute('aria-expanded', 'true');
}
} }
// Bitácoras const isExpanded = this.getAttribute('aria-expanded') === 'true';
if (currentPath.includes('/bitacoras/')) {
const bitacorasCollapse = document.getElementById('submenuBitacoras'); // Rotar el ícono inmediatamente
if (bitacorasCollapse) { if (icon) {
bitacorasCollapse.classList.add('show'); icon.style.transform = isExpanded ? 'rotate(0deg)' : 'rotate(180deg)';
const trigger = document.querySelector('[aria-controls="submenuBitacoras"]');
if (trigger) trigger.setAttribute('aria-expanded', 'true');
}
}
} }
// Actualizar atributo ARIA
this.setAttribute('aria-expanded', !isExpanded);
});
// 4. Manejar eventos de Bootstrap para sincronización
target.addEventListener('show.bs.collapse', () => {
trigger.setAttribute('aria-expanded', 'true');
if (icon) icon.style.transform = 'rotate(180deg)';
});
target.addEventListener('hide.bs.collapse', () => {
trigger.setAttribute('aria-expanded', 'false');
if (icon) icon.style.transform = 'rotate(0deg)';
});
});
// Marcar enlaces activos // Marcar enlaces activos
function marcarEnlacesActivos() { document.querySelectorAll('.nav-link').forEach(link => {
const navLinks = document.querySelectorAll('.nav-link'); const href = link.getAttribute('href')?.replace(/\/$/, '');
navLinks.forEach(link => { if (href && (currentPath === href || currentPath.startsWith(href + '/'))) {
const href = link.getAttribute('href');
if (href && currentPath === href) {
link.classList.add('active'); link.classList.add('active');
} }
}); });
}
// Inicializar todo
inicializarCollapses();
marcarEnlacesActivos();
}); });
</script> </script>

View File

@@ -54,12 +54,12 @@
<button class="menu-toggle d-md-none me-3" type="button" data-bs-toggle="offcanvas" data-bs-target="#sidebarMenu"> <button class="menu-toggle d-md-none me-3" type="button" data-bs-toggle="offcanvas" data-bs-target="#sidebarMenu">
</button> </button>
<span class="navbar-brand">SIIH | Administrador</span> <span class="navbar-brand">SIIH | Importador</span>
<div class="d-flex ms-auto text-white"> <div class="d-flex ms-auto text-white">
<div id="navbar-content"> <div id="navbar-content">
<?php <?php
// Verifica si estás en el dashboard principal del administrador // Verifica si estás en el dashboard principal del administrador
$esDashboard = str_contains($_SERVER['REQUEST_URI'], '/administrador/dashboard'); $esDashboard = str_contains($_SERVER['REQUEST_URI'], '/IMPORTADORES/importadores/dashboard');
if ($esDashboard): ?> if ($esDashboard): ?>
<span id="welcome-text">Bienvenido, <?= htmlspecialchars($_SESSION['usuario_nombre']) ?></span> <span id="welcome-text">Bienvenido, <?= htmlspecialchars($_SESSION['usuario_nombre']) ?></span>
@@ -97,7 +97,7 @@
</li> </li>
<!-- VINCULACIONES --> <!-- VINCULACIONES -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuVinculaciones" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuVinculacionesDesktop" role="button" aria-expanded="false" aria-controls="submenuVinculacionesDesktop">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M12.586 4.586a2 2 0 112.828 2.828l-3 3a2 2 0 01-2.828 0 1 1 0 00-1.414 1.414 4 4 0 005.656 0l3-3a4 4 0 00-5.656-5.656l-1.5 1.5a1 1 0 101.414 1.414l1.5-1.5z"/> <path d="M12.586 4.586a2 2 0 112.828 2.828l-3 3a2 2 0 01-2.828 0 1 1 0 00-1.414 1.414 4 4 0 005.656 0l3-3a4 4 0 00-5.656-5.656l-1.5 1.5a1 1 0 101.414 1.414l1.5-1.5z"/>
<path d="M7.414 15.414a2 2 0 01-2.828-2.828l3-3a2 2 0 012.828 0 1 1 0 001.414-1.414 4 4 0 00-5.656 0l-3 3a4 4 0 105.656 5.656l1.5-1.5a1 1 0 10-1.414-1.414l-1.5 1.5z"/> <path d="M7.414 15.414a2 2 0 01-2.828-2.828l3-3a2 2 0 012.828 0 1 1 0 001.414-1.414 4 4 0 00-5.656 0l-3 3a4 4 0 105.656 5.656l1.5-1.5a1 1 0 10-1.414-1.414l-1.5 1.5z"/>
@@ -107,7 +107,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuVinculaciones"> <div class="collapse" id="submenuVinculacionesDesktop">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/vinculaciones/vinculacionesUsuario" class="nav-link"> <a href="/IMPORTADORES/vinculaciones/vinculacionesUsuario" class="nav-link">
@@ -124,7 +124,7 @@
</li> </li>
<!-- TRANSPORTISTAS --> <!-- TRANSPORTISTAS -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuTransportistas" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuTransportistasDesktop" role="button" aria-expanded="false" aria-controls="submenuTransportistasDesktop">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M3 4a1 1 0 011-1h12a1 1 0 011 1v2a1 1 0 01-1 1H4a1 1 0 01-1-1V4zM3 10a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H4a1 1 0 01-1-1v-6zM14 9a1 1 0 00-1 1v6a1 1 0 001 1h2a1 1 0 001-1v-6a1 1 0 00-1-1h-2z"/> <path d="M3 4a1 1 0 011-1h12a1 1 0 011 1v2a1 1 0 01-1 1H4a1 1 0 01-1-1V4zM3 10a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H4a1 1 0 01-1-1v-6zM14 9a1 1 0 00-1 1v6a1 1 0 001 1h2a1 1 0 001-1v-6a1 1 0 00-1-1h-2z"/>
</svg> </svg>
@@ -133,7 +133,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuTransportistas"> <div class="collapse" id="submenuTransportistasDesktop">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/transportistas/lista" class="nav-link"> <a href="/IMPORTADORES/transportistas/lista" class="nav-link">
@@ -155,7 +155,7 @@
</li> </li>
<!-- TRANSPORTES --> <!-- TRANSPORTES -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuTransportes" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuTransportesDesktop" role="button" aria-expanded="false" aria-controls="submenuTransportesDesktop">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M8 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM15 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0z"/> <path d="M8 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM15 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0z"/>
<path d="M3 4a1 1 0 00-1 1v10a1 1 0 001 1h1.464a1.5 1.5 0 002.072 0h6.928a1.5 1.5 0 002.072 0H17a1 1 0 001-1V5a1 1 0 00-1-1H3zM4 7h12v2H4V7zm0 4h12v2H4v-2z"/> <path d="M3 4a1 1 0 00-1 1v10a1 1 0 001 1h1.464a1.5 1.5 0 002.072 0h6.928a1.5 1.5 0 002.072 0H17a1 1 0 001-1V5a1 1 0 00-1-1H3zM4 7h12v2H4V7zm0 4h12v2H4v-2z"/>
@@ -165,7 +165,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuTransportes"> <div class="collapse" id="submenuTransportesDesktop">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/transportes/lista" class="nav-link"> <a href="/IMPORTADORES/transportes/lista" class="nav-link">
@@ -187,7 +187,7 @@
</li> </li>
<!-- CHOFERES --> <!-- CHOFERES -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuChoferes" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuChoferesDesktop" role="button" aria-expanded="false" aria-controls="submenuChoferesDesktop">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z" clip-rule="evenodd"/> <path fill-rule="evenodd" d="M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z" clip-rule="evenodd"/>
</svg> </svg>
@@ -196,7 +196,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuChoferes"> <div class="collapse" id="submenuChoferesDesktop">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/choferes/lista" class="nav-link"> <a href="/IMPORTADORES/choferes/lista" class="nav-link">
@@ -213,7 +213,7 @@
</li> </li>
<!-- PROVEEDORES --> <!-- PROVEEDORES -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuProveedores" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuProveedoresDesktop" role="button" aria-expanded="false" aria-controls="submenuProveedoresDesktop">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/> <path d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/>
<path fill-rule="evenodd" d="M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V5a2 2 0 00-2-2H4zm12 12H4l4-8 3 6 2-4 3 6z" clip-rule="evenodd"/> <path fill-rule="evenodd" d="M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V5a2 2 0 00-2-2H4zm12 12H4l4-8 3 6 2-4 3 6z" clip-rule="evenodd"/>
@@ -223,7 +223,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuProveedores"> <div class="collapse" id="submenuProveedoresDesktop">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/proveedores" class="nav-link"> <a href="/IMPORTADORES/proveedores" class="nav-link">
@@ -240,7 +240,7 @@
</li> </li>
<!-- PRODUCTOS FRECUENTES --> <!-- PRODUCTOS FRECUENTES -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuProductosFrecuentes" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuProductosFrecuentesDesktop" role="button" aria-expanded="false" aria-controls="submenuProductosFrecuentesDesktop">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg> </svg>
@@ -249,7 +249,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuProductosFrecuentes"> <div class="collapse" id="submenuProductosFrecuentesDesktop">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/productos_frecuentes/editar" class="nav-link"> <a href="/IMPORTADORES/productos_frecuentes/editar" class="nav-link">
@@ -273,7 +273,7 @@
</li> </li>
<!-- SOLICITUDES DE IMPORTACIÓN --> <!-- SOLICITUDES DE IMPORTACIÓN -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuSolicitudes" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuSolicitudesDesktop" role="button" aria-expanded="false" aria-controls="submenuSolicitudesDesktop">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z" clip-rule="evenodd"/> <path fill-rule="evenodd" d="M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z" clip-rule="evenodd"/>
</svg> </svg>
@@ -282,7 +282,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuSolicitudes"> <div class="collapse" id="submenuSolicitudesDesktop">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/solicitud_importacion/lista" class="nav-link"> <a href="/IMPORTADORES/solicitud_importacion/lista" class="nav-link">
@@ -299,7 +299,7 @@
</li> </li>
<!-- EXPEDIENTE ELECTRÓNICO --> <!-- EXPEDIENTE ELECTRÓNICO -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuExpediente" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuExpedienteDesktop" role="button" aria-expanded="false" aria-controls="submenuExpedienteDesktop">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M3 4a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1H4a1 1 0 01-1-1V4zm6 0a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1V4zm6 0a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1V4zM3 10a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1H4a1 1 0 01-1-1v-3zm6 0a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1v-3zm6 0a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1v-3z" clip-rule="evenodd"/> <path fill-rule="evenodd" d="M3 4a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1H4a1 1 0 01-1-1V4zm6 0a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1V4zm6 0a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1V4zM3 10a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1H4a1 1 0 01-1-1v-3zm6 0a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1v-3zm6 0a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1v-3z" clip-rule="evenodd"/>
</svg> </svg>
@@ -308,7 +308,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuExpediente"> <div class="collapse" id="submenuExpedienteDesktop">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/expediente/index" class="nav-link"> <a href="/IMPORTADORES/expediente/index" class="nav-link">
@@ -363,7 +363,7 @@
</li> </li>
<!-- VINCULACIONES --> <!-- VINCULACIONES -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuVinculaciones" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuVinculacionesMobile" role="button" aria-expanded="false" aria-controls="submenuVinculacionesMobile">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M12.586 4.586a2 2 0 112.828 2.828l-3 3a2 2 0 01-2.828 0 1 1 0 00-1.414 1.414 4 4 0 005.656 0l3-3a4 4 0 00-5.656-5.656l-1.5 1.5a1 1 0 101.414 1.414l1.5-1.5z"/> <path d="M12.586 4.586a2 2 0 112.828 2.828l-3 3a2 2 0 01-2.828 0 1 1 0 00-1.414 1.414 4 4 0 005.656 0l3-3a4 4 0 00-5.656-5.656l-1.5 1.5a1 1 0 101.414 1.414l1.5-1.5z"/>
<path d="M7.414 15.414a2 2 0 01-2.828-2.828l3-3a2 2 0 012.828 0 1 1 0 001.414-1.414 4 4 0 00-5.656 0l-3 3a4 4 0 105.656 5.656l1.5-1.5a1 1 0 10-1.414-1.414l-1.5 1.5z"/> <path d="M7.414 15.414a2 2 0 01-2.828-2.828l3-3a2 2 0 012.828 0 1 1 0 001.414-1.414 4 4 0 00-5.656 0l-3 3a4 4 0 105.656 5.656l1.5-1.5a1 1 0 10-1.414-1.414l-1.5 1.5z"/>
@@ -373,7 +373,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuVinculaciones"> <div class="collapse" id="submenuVinculacionesMobile">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/vinculaciones/vinculacionesUsuario" class="nav-link"> <a href="/IMPORTADORES/vinculaciones/vinculacionesUsuario" class="nav-link">
@@ -390,7 +390,7 @@
</li> </li>
<!-- TRANSPORTISTAS --> <!-- TRANSPORTISTAS -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuTransportistas" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuTransportistasMobile" role="button" aria-expanded="false" aria-controls="submenuTransportistasMobile">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M3 4a1 1 0 011-1h12a1 1 0 011 1v2a1 1 0 01-1 1H4a1 1 0 01-1-1V4zM3 10a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H4a1 1 0 01-1-1v-6zM14 9a1 1 0 00-1 1v6a1 1 0 001 1h2a1 1 0 001-1v-6a1 1 0 00-1-1h-2z"/> <path d="M3 4a1 1 0 011-1h12a1 1 0 011 1v2a1 1 0 01-1 1H4a1 1 0 01-1-1V4zM3 10a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H4a1 1 0 01-1-1v-6zM14 9a1 1 0 00-1 1v6a1 1 0 001 1h2a1 1 0 001-1v-6a1 1 0 00-1-1h-2z"/>
</svg> </svg>
@@ -399,7 +399,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuTransportistas"> <div class="collapse" id="submenuTransportistasMobile">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/transportistas/lista" class="nav-link"> <a href="/IMPORTADORES/transportistas/lista" class="nav-link">
@@ -421,7 +421,7 @@
</li> </li>
<!-- TRANSPORTES --> <!-- TRANSPORTES -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuTransportes" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuTransportesMobile" role="button" aria-expanded="false" aria-controls="submenuTransportesMobile">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M8 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM15 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0z"/> <path d="M8 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0zM15 16.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0z"/>
<path d="M3 4a1 1 0 00-1 1v10a1 1 0 001 1h1.464a1.5 1.5 0 002.072 0h6.928a1.5 1.5 0 002.072 0H17a1 1 0 001-1V5a1 1 0 00-1-1H3zM4 7h12v2H4V7zm0 4h12v2H4v-2z"/> <path d="M3 4a1 1 0 00-1 1v10a1 1 0 001 1h1.464a1.5 1.5 0 002.072 0h6.928a1.5 1.5 0 002.072 0H17a1 1 0 001-1V5a1 1 0 00-1-1H3zM4 7h12v2H4V7zm0 4h12v2H4v-2z"/>
@@ -431,7 +431,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuTransportes"> <div class="collapse" id="submenuTransportesMobile">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/transportes/lista" class="nav-link"> <a href="/IMPORTADORES/transportes/lista" class="nav-link">
@@ -453,7 +453,7 @@
</li> </li>
<!-- CHOFERES --> <!-- CHOFERES -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuChoferes" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuChoferesMobile" role="button" aria-expanded="false" aria-controls="submenuChoferesMobile">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z" clip-rule="evenodd"/> <path fill-rule="evenodd" d="M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z" clip-rule="evenodd"/>
</svg> </svg>
@@ -462,7 +462,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuChoferes"> <div class="collapse" id="submenuChoferesMobile">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/choferes/lista" class="nav-link"> <a href="/IMPORTADORES/choferes/lista" class="nav-link">
@@ -479,7 +479,7 @@
</li> </li>
<!-- PROVEEDORES --> <!-- PROVEEDORES -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuProveedores" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuProveedoresMobile" role="button" aria-expanded="false" aria-controls="submenuProveedoresMobile">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/> <path d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/>
<path fill-rule="evenodd" d="M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V5a2 2 0 00-2-2H4zm12 12H4l4-8 3 6 2-4 3 6z" clip-rule="evenodd"/> <path fill-rule="evenodd" d="M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V5a2 2 0 00-2-2H4zm12 12H4l4-8 3 6 2-4 3 6z" clip-rule="evenodd"/>
@@ -489,7 +489,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuProveedores"> <div class="collapse" id="submenuProveedoresMobile">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/proveedores" class="nav-link"> <a href="/IMPORTADORES/proveedores" class="nav-link">
@@ -506,7 +506,7 @@
</li> </li>
<!-- PRODUCTOS FRECUENTES --> <!-- PRODUCTOS FRECUENTES -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuProductosFrecuentes" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuProductosFrecuentesMobile" role="button" aria-expanded="false" aria-controls="submenuProductosFrecuentesMobile">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/> <path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg> </svg>
@@ -515,7 +515,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuProductosFrecuentes"> <div class="collapse" id="submenuProductosFrecuentesMobile">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/productos_frecuentes/editar" class="nav-link"> <a href="/IMPORTADORES/productos_frecuentes/editar" class="nav-link">
@@ -539,7 +539,7 @@
</li> </li>
<!-- SOLICITUDES DE IMPORTACIÓN --> <!-- SOLICITUDES DE IMPORTACIÓN -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuSolicitudes" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuSolicitudesMobile" role="button" aria-expanded="false" aria-controls="submenuSolicitudesMobile">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z" clip-rule="evenodd"/> <path fill-rule="evenodd" d="M4 4a2 2 0 012-2h4.586A2 2 0 0112 2.586L15.414 6A2 2 0 0116 7.414V16a2 2 0 01-2 2H6a2 2 0 01-2-2V4zm2 6a1 1 0 011-1h6a1 1 0 110 2H7a1 1 0 01-1-1zm1 3a1 1 0 100 2h6a1 1 0 100-2H7z" clip-rule="evenodd"/>
</svg> </svg>
@@ -548,7 +548,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuSolicitudes"> <div class="collapse" id="submenuSolicitudesMobile">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/solicitud_importacion/lista" class="nav-link"> <a href="/IMPORTADORES/solicitud_importacion/lista" class="nav-link">
@@ -565,7 +565,7 @@
</li> </li>
<!-- EXPEDIENTE ELECTRÓNICO --> <!-- EXPEDIENTE ELECTRÓNICO -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" data-bs-toggle="collapse" href="#submenuExpediente" role="button" aria-expanded="false"> <a class="nav-link" data-bs-toggle="collapse" href="#submenuExpedienteMobile" role="button" aria-expanded="false" aria-controls="submenuExpedienteMobile">
<svg class="icon" fill="currentColor" viewBox="0 0 20 20"> <svg class="icon" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M3 4a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1H4a1 1 0 01-1-1V4zm6 0a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1V4zm6 0a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1V4zM3 10a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1H4a1 1 0 01-1-1v-3zm6 0a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1v-3zm6 0a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1v-3z" clip-rule="evenodd"/> <path fill-rule="evenodd" d="M3 4a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1H4a1 1 0 01-1-1V4zm6 0a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1V4zm6 0a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1V4zM3 10a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1H4a1 1 0 01-1-1v-3zm6 0a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1v-3zm6 0a1 1 0 011-1h3a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1v-3z" clip-rule="evenodd"/>
</svg> </svg>
@@ -574,7 +574,7 @@
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 4 4 4-4"/>
</svg> </svg>
</a> </a>
<div class="collapse" id="submenuExpediente"> <div class="collapse" id="submenuExpedienteMobile">
<ul class="nav flex-column submenu"> <ul class="nav flex-column submenu">
<li class="nav-item"> <li class="nav-item">
<a href="/IMPORTADORES/expediente/index" class="nav-link"> <a href="/IMPORTADORES/expediente/index" class="nav-link">
@@ -601,16 +601,19 @@
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script> <script>
// Simular lógica de dashboard
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
const esDashboard = window.location.pathname.includes('/administrador/dashboard'); const esDashboard = window.location.pathname.includes('/importadores/dashboard');
const welcomeText = document.getElementById('welcome-text'); const welcomeText = document.getElementById('welcome-text');
const logoutBtn = document.getElementById('logout-btn'); const logoutBtn = document.getElementById('logout-btn');
if (!esDashboard) { if (!esDashboard) {
if (welcomeText) {
welcomeText.style.display = 'none'; welcomeText.style.display = 'none';
}
if (logoutBtn) {
logoutBtn.style.display = 'inline-block'; logoutBtn.style.display = 'inline-block';
} }
}
// Manejar estados activos basados en URL actual // Manejar estados activos basados en URL actual
const currentPath = window.location.pathname; const currentPath = window.location.pathname;
@@ -623,31 +626,66 @@
} }
}); });
// Manejar collapse manualmente
document.querySelectorAll('[data-bs-toggle="collapse"]').forEach(trigger => { document.querySelectorAll('[data-bs-toggle="collapse"]').forEach(trigger => {
// Desactivar Bootstrap
trigger.removeAttribute('data-bs-toggle');
// Inicializar estado correcto
const target = document.querySelector(trigger.getAttribute('href'));
if (target) {
target.style.transition = 'height 0.3s ease, opacity 0.2s ease';
target.style.overflow = 'hidden';
if (!target.classList.contains('show')) {
target.style.height = '0';
target.style.opacity = '0';
}
}
trigger.addEventListener('click', function(e) { trigger.addEventListener('click', function(e) {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); const target = document.querySelector(this.getAttribute('href'));
const icon = this.querySelector('.collapse-icon');
const targetId = this.getAttribute('href'); if (!target) return;
const targetElement = document.querySelector(targetId);
const isExpanded = this.getAttribute('aria-expanded') === 'true';
if (targetElement) { const isExpanding = this.getAttribute('aria-expanded') !== 'true';
if (isExpanded) {
// Cerrar if (isExpanding) {
targetElement.classList.remove('show');
this.setAttribute('aria-expanded', 'false');
} else {
// Abrir // Abrir
targetElement.classList.add('show'); target.classList.add('show');
target.style.height = '0';
target.style.opacity = '0';
target.style.display = 'block';
// Forzar reflow
void target.offsetHeight;
target.style.height = target.scrollHeight + 'px';
target.style.opacity = '1';
this.setAttribute('aria-expanded', 'true'); this.setAttribute('aria-expanded', 'true');
} if (icon) icon.style.transform = 'rotate(180deg)';
} else {
// Cerrar
target.style.height = target.scrollHeight + 'px';
target.style.opacity = '1';
// Forzar reflow
void target.offsetHeight;
target.style.height = '0';
target.style.opacity = '0';
setTimeout(() => {
target.classList.remove('show');
target.style.display = '';
}, 300);
this.setAttribute('aria-expanded', 'false');
if (icon) icon.style.transform = 'rotate(0deg)';
} }
}); });
// Remover el atributo data-bs-toggle para evitar conflictos
trigger.removeAttribute('data-bs-toggle');
}); });
}); });
</script> </script>

View File

@@ -140,7 +140,7 @@ if ($tipoUsuario === 'agente_aduanal') {
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">CONFIGURACIÓN ADUANA / PATENTE</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">CONFIGURACIÓN ADUANA / PATENTE</h4>
<div class="card p-4 shadow-sm bg-white card-hover position-relative h-auto"> <div class="card p-4 shadow-sm bg-white card-hover position-relative h-auto fade-in-up">
<!-- Se agrega enctype para subir archivos --> <!-- Se agrega enctype para subir archivos -->
<form action="/IMPORTADORES/patente/guardar" method="POST" id="formAltaPatente"> <form action="/IMPORTADORES/patente/guardar" method="POST" id="formAltaPatente">
<!-- Pestañas de navegación --> <!-- Pestañas de navegación -->

View File

@@ -137,7 +137,7 @@ if ($tipoUsuario === 'agente_aduanal') {
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">CONFIGURACIÓN ADUANA / PATENTE</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">CONFIGURACIÓN ADUANA / PATENTE</h4>
<div class="card p-4 shadow-sm bg-white card-hover position-relative h-auto"> <div class="card p-4 shadow-sm bg-white card-hover position-relative h-auto fade-in-up">
<!-- Se agrega enctype para subir archivos --> <!-- Se agrega enctype para subir archivos -->
<form action="/IMPORTADORES/patente/actualizar" method="POST" id="formEdicionPatente"> <form action="/IMPORTADORES/patente/actualizar" method="POST" id="formEdicionPatente">
<!-- Campo oculto para el ID --> <!-- Campo oculto para el ID -->

View File

@@ -83,8 +83,8 @@ if ($tipoUsuario === 'agente_aduanal') {
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">📑 Registro de Patentes Aduanales</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">📑 Registro de Patentes Aduanales</h4>
<a href="/IMPORTADORES/patente/alta" class="btn btn-success mb-3 mt-auto w-auto btn-animated"> Nueva Patente</a> <a href="/IMPORTADORES/patente/alta" class="btn btn-success mb-3 mt-auto w-auto btn-animated fade-in-up"> Nueva Patente</a>
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped" id="tabla-patentes"> <table class="table table-striped" id="tabla-patentes">
<thead class="table-dark"> <thead class="table-dark">

View File

@@ -70,6 +70,11 @@
.spinner-border { display: inline-block; width: 1rem; height: 1rem; vertical-align: text-bottom; border: 0.125em solid currentColor; border-right-color: transparent; .spinner-border { display: inline-block; width: 1rem; height: 1rem; vertical-align: text-bottom; border: 0.125em solid currentColor; border-right-color: transparent;
border-radius: 50%; animation: spinner-border 0.75s linear infinite; } border-radius: 50%; animation: spinner-border 0.75s linear infinite; }
.spinner-border-sm { width: 0.875rem; height: 0.875rem; border-width: 0.125em; } .spinner-border-sm { width: 0.875rem; height: 0.875rem; border-width: 0.125em; }
.fade-in-up { animation: fadeInUp 0.8s ease-out; }
@keyframes fadeInUp {
from { opacity: 0; transform: translateY(30px); }
to { opacity: 1; transform: translateY(0); }
}
</style> </style>
</head> </head>
<body> <body>
@@ -91,7 +96,7 @@
</div> </div>
<?php endif; ?> <?php endif; ?>
<div class="card shadow-sm p-4 mb-4 bg-white card-hover position-relative h-auto"> <div class="card shadow-sm p-4 mb-4 bg-white card-hover position-relative h-auto fade-in-up">
<!-- Switch general de notificaciones --> <!-- Switch general de notificaciones -->
<div class="section-divider"> <div class="section-divider">
<div class="form-check form-switch"> <div class="form-check form-switch">

View File

@@ -62,6 +62,27 @@
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); transition: left 0.5s; } background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); transition: left 0.5s; }
.btn-animated:hover::before { left: 100%; } .btn-animated:hover::before { left: 100%; }
.alert { border: none; border-radius: 12px; background: rgba(255, 255, 255, 0.9); backdrop-filter: blur(10px); } .alert { border: none; border-radius: 12px; background: rgba(255, 255, 255, 0.9); backdrop-filter: blur(10px); }
.btn-indigo { background-color: #6610f2; color: white; }
.btn-indigo:hover { background-color: #520dc2; color: white; }
.text-indigo { color: #520dc2; }
.btn-orange { background-color: orangeRed; color: white; }
.btn-orange:hover { background-color: #ff3600; color: white; }
.text-orange { color: orangeRed; }
.btn-teal { background-color: #4dd4ac ; color: white; }
.btn-teal:hover { background-color: #20c997; color: black; }
.text-teal { color: #4dd4ac; }
.btn-lime { background-color: #84cc16; color: white; }
.text-lime { color: #84cc16; }
.btn-lime:hover { background-color: #65a30d; color: black; }
.btn-cyan { background-color: #06b6d4; color: white; }
.text-cyan { color: #06b6d4; }
.btn-cyan:hover { background-color: #0891b2; color: white; }
.btn-violet { background-color: #8b5cf6; color: white; }
.text-violet { color: #8b5cf6; }
.btn-violet:hover { background-color: #7c3aed; color: white; }
.btn-lila { background-color: #c4b5fd; /* violeta claro */ color: white; border: none; }
.btn-lila:hover { background-color: #a78bfa; /* tono ligeramente más fuerte */ color: white; }
.text-lila { color: #c4b5fd; }
</style> </style>
</head> </head>
<body> <body>
@@ -74,14 +95,14 @@
<div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: 0.1s;"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: 0.1s;">
<div class="card shadow-sm p-3 card-hover position-relative h-100"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<div class="card-body p-0 d-flex flex-column"> <div class="card-body p-0 d-flex flex-column">
<h5 class="text-primary mb-3"> <h5 class="text-teal mb-3">
<i class="fas fa-bell me-2"></i> <i class="fas fa-bell me-2"></i>
Notificaciones Notificaciones
</h5> </h5>
<p class="text-muted small flex-grow-1 mb-4"> <p class="text-muted small flex-grow-1 mb-4">
Gestiona y configura las notificaciones del sistema para mantenerte informado. Gestiona y configura las notificaciones del sistema para mantenerte informado.
</p> </p>
<button class="btn btn-primary btn-sm mt-auto w-100 btn-animated" <button class="btn btn-teal btn-sm mt-auto w-100 btn-animated"
onclick="navigateWithAnimation(this, '/IMPORTADORES/preferencias/notificaciones')"> onclick="navigateWithAnimation(this, '/IMPORTADORES/preferencias/notificaciones')">
<i class="fas fa-cog me-2"></i> <i class="fas fa-cog me-2"></i>
Configurar Notificaciones Configurar Notificaciones
@@ -94,14 +115,14 @@
<div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: 0.2s;"> <div class="col-md-4 animate__animated animate__fadeInUp" style="animation-delay: 0.2s;">
<div class="card shadow-sm p-3 card-hover position-relative h-100"> <div class="card shadow-sm p-3 card-hover position-relative h-100">
<div class="card-body p-0 d-flex flex-column"> <div class="card-body p-0 d-flex flex-column">
<h5 class="text-success mb-3"> <h5 class="text-lime mb-3">
<i class="fas fa-list me-2"></i> <i class="fas fa-list me-2"></i>
Catálogos Catálogos
</h5> </h5>
<p class="text-muted small flex-grow-1 mb-4"> <p class="text-muted small flex-grow-1 mb-4">
Personaliza la visualización de tus catálogos y organiza tu contenido. Personaliza la visualización de tus catálogos y organiza tu contenido.
</p> </p>
<button class="btn btn-success btn-sm mt-auto w-100 btn-animated" <button class="btn btn-lime btn-sm mt-auto w-100 btn-animated"
onclick="navigateWithAnimation(this, '/IMPORTADORES/preferencias/catalogos')"> onclick="navigateWithAnimation(this, '/IMPORTADORES/preferencias/catalogos')">
<i class="fas fa-palette me-2"></i> <i class="fas fa-palette me-2"></i>
Personalizar Catálogos Personalizar Catálogos

View File

@@ -45,6 +45,11 @@
.day-preset .btn { margin-right: 10px; margin-bottom: 5px; } .day-preset .btn { margin-right: 10px; margin-bottom: 5px; }
.form-check-input:checked { background-color: #0d6efd; border-color: #0d6efd; } .form-check-input:checked { background-color: #0d6efd; border-color: #0d6efd; }
.btn-outline-primary.active { background-color: #0d6efd; border-color: #0d6efd; color: white; } .btn-outline-primary.active { background-color: #0d6efd; border-color: #0d6efd; color: white; }
.fade-in-up { animation: fadeInUp 0.8s ease-out; }
@keyframes fadeInUp {
from { opacity: 0; transform: translateY(30px); }
to { opacity: 1; transform: translateY(0); }
}
</style> </style>
</head> </head>
<body> <body>
@@ -67,7 +72,7 @@
</div> </div>
<?php endif; ?> <?php endif; ?>
<div class="card shadow-sm p-4 mb-4 bg-white card-hover position-relative h-auto"> <div class="card shadow-sm p-4 mb-4 bg-white card-hover position-relative h-auto fade-in-up">
<!-- Switch general de notificaciones --> <!-- Switch general de notificaciones -->
<div class="section-divider"> <div class="section-divider">
<div class="form-check form-switch"> <div class="form-check form-switch">

View File

@@ -121,7 +121,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow"> Alta de Producto Frecuente</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow"> Alta de Producto Frecuente</h4>
<div class="card p-4 shadow-sm bg-white card-hover position-relative h-auto"> <div class="card p-4 shadow-sm bg-white card-hover position-relative h-auto fade-in-up">
<form id="altaProductoFrecuenteForm" action="/IMPORTADORES/productos_frecuentes/guardar" method="POST"> <form id="altaProductoFrecuenteForm" action="/IMPORTADORES/productos_frecuentes/guardar" method="POST">
<div class="row g-3 form-group-animated"> <div class="row g-3 form-group-animated">
<!-- Sinónimo, Fracción, NICO --> <!-- Sinónimo, Fracción, NICO -->

View File

@@ -114,7 +114,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✏️ Editar Producto Frecuente</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✏️ Editar Producto Frecuente</h4>
<div class="card p-4 shadow-sm bg-white card-hover position-relative h-auto"> <div class="card p-4 shadow-sm bg-white card-hover position-relative h-auto fade-in-up">
<form id="editarProductoFrecuenteForm" action="/IMPORTADORES/productos_frecuentes/actualizar" method="POST"> <form id="editarProductoFrecuenteForm" action="/IMPORTADORES/productos_frecuentes/actualizar" method="POST">
<input type="hidden" name="id_producto_frecuente" value="<?= htmlspecialchars($producto['id_producto_frecuente']) ?>"> <input type="hidden" name="id_producto_frecuente" value="<?= htmlspecialchars($producto['id_producto_frecuente']) ?>">
<div class="row g-3 form-group-animated"> <div class="row g-3 form-group-animated">

View File

@@ -69,8 +69,8 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">📋 Productos Frecuentes</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">📋 Productos Frecuentes</h4>
<a href="/IMPORTADORES/productos_frecuentes/alta" class="btn btn-success mb-3 mt-auto w-auto btn-animated"> Nuevo Producto</a> <a href="/IMPORTADORES/productos_frecuentes/alta" class="btn btn-success mb-3 mt-auto w-auto btn-animated fade-in-up"> Nuevo Producto</a>
<div class="card p-4 shadow-sm card-hover position-relative h-auto"> <div class="card p-4 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table id="tablaProductosFrecuentes" class="table table-striped table-bordered"> <table id="tablaProductosFrecuentes" class="table table-striped table-bordered">
<thead class="table-dark"> <thead class="table-dark">

View File

@@ -118,7 +118,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow"> Registro de Proveedor</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow"> Registro de Proveedor</h4>
<div class="card p-4 shadow-sm card-hover position-relative h-auto"> <div class="card p-4 shadow-sm card-hover position-relative h-auto fade-in-up">
<form action="/IMPORTADORES/proveedores/guardar" method="POST" enctype="multipart/form-data" id="formAltaProveedores"> <form action="/IMPORTADORES/proveedores/guardar" method="POST" enctype="multipart/form-data" id="formAltaProveedores">
<div class="row g-3"> <div class="row g-3">
<div class="col-md-4 form-group-animated"> <div class="col-md-4 form-group-animated">

View File

@@ -67,9 +67,9 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">📄 Listado de Proveedores</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">📄 Listado de Proveedores</h4>
<a href="/IMPORTADORES/proveedores/crear" class="btn btn-success mb-3 mt-auto w-auto btn-animated"> Nuevo Proveedor</a> <a href="/IMPORTADORES/proveedores/crear" class="btn btn-success mb-3 mt-auto w-auto btn- fade-in-up"> Nuevo Proveedor</a>
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<br> <br>
<table id="proveedores-table" class="table table-striped nowrap" style="width:100%"> <table id="proveedores-table" class="table table-striped nowrap" style="width:100%">
<thead> <thead>

View File

@@ -58,6 +58,27 @@
.btn-animated:hover::before { left: 100%; } .btn-animated:hover::before { left: 100%; }
.hide { display: none !important; } .hide { display: none !important; }
.alert { top: 75px; left: 275px; right: 50px; position: fixed; z-index: 1050; width: calc(100% - 285px); } .alert { top: 75px; left: 275px; right: 50px; position: fixed; z-index: 1050; width: calc(100% - 285px); }
/* ========== ANIMACIONES PARA INPUTS TEXTO ========== */
.form-control:not(.no-animation) { transition: all 0.3s ease; border: 2px solid #dee2e6; position: relative; }
.form-control:not(.no-animation).shake { animation: shake 0.5s ease-in-out; }
@keyframes shake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-5px); }
75% { transform: translateX(5px); }
}
/* Animación para los campos del formulario */
.form-group-animated { opacity: 0; transform: translateY(20px); animation: slideUp 0.6s ease-out forwards; }
.form-group-animated:nth-child(1) { animation-delay: 0.1s; }
.form-group-animated:nth-child(2) { animation-delay: 0.2s; }
.form-group-animated:nth-child(3) { animation-delay: 0.3s; }
.form-group-animated:nth-child(4) { animation-delay: 0.4s; }
.form-group-animated:nth-child(5) { animation-delay: 0.5s; }
.form-group-animated:nth-child(6) { animation-delay: 0.6s; }
.form-group-animated:nth-child(7) { animation-delay: 0.7s; }
.form-group-animated:nth-child(8) { animation-delay: 0.8s; }
.form-group-animated:nth-child(9) { animation-delay: 0.9s; }
.form-group-animated:nth-child(10) { animation-delay: 1.0s; }
@keyframes slideUp { to { opacity: 1; transform: translateY(0); } }
</style> </style>
</head> </head>
<body> <body>
@@ -79,25 +100,28 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow"> Nueva Solicitud de Importación</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow"> Nueva Solicitud de Importación</h4>
<div class="card p-4 bg-white shadow-sm card-hover position-relative h-auto"> <div class="card p-4 bg-white shadow-sm card-hover position-relative h-auto fade-in-up">
<form id="solicitudForm" action="/IMPORTADORES/solicitud_importacion/guardar" method="POST" enctype="multipart/form-data"> <form id="solicitudForm" action="/IMPORTADORES/solicitud_importacion/guardar" method="POST" enctype="multipart/form-data">
<!-- Sección principal --> <!-- Sección principal -->
<div class="row"> <div class="row">
<div class="col-md-3 mb-3"> <div class="col-md-3 mb-3 form-group-animated">
<label for="numero_factura" class="form-label">Número de Factura</label> <label for="numero_factura" class="form-label">Número de Factura</label>
<input id="numero_factura" name="numero_factura" type="text" class="form-control" required> <input id="numero_factura" name="numero_factura" type="text" class="form-control" required>
</div> </div>
<div class="col-md-3 mb-3">
<div class="col-md-3 mb-3 form-group-animated">
<label for="fecha_factura" class="form-label">Fecha de Factura</label> <label for="fecha_factura" class="form-label">Fecha de Factura</label>
<input id="fecha_factura" name="fecha_factura" type="date" class="form-control" required> <input id="fecha_factura" name="fecha_factura" type="date" class="form-control" required>
</div> </div>
<div class="col-md-3 mb-3"> <div class="col-md-3 mb-3">
<label for="proveedor_id" class="form-label">Proveedor</label> <label for="proveedor_id" class="form-label">Proveedor</label>
<select id="proveedor_id" name="proveedor_id" class="form-select searchable" required> <select id="proveedor_id" name="proveedor_id" class="form-select searchable" required>
<option value="">Cargando proveedores…</option> <option value="">Cargando proveedores…</option>
</select> </select>
</div> </div>
<div class="col-md-3 mb-3"> <div class="col-md-3 mb-3">
<label for="anexo22_apendice" class="form-label">Anexo 22 Apéndice</label> <label for="anexo22_apendice" class="form-label">Anexo 22 Apéndice</label>
<select id="anexo22_apendice" name="anexo22_apendice" class="form-select searchable" required> <select id="anexo22_apendice" name="anexo22_apendice" class="form-select searchable" required>
@@ -124,6 +148,7 @@
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</div> </div>
<div class="col-md-3 mb-3"> <div class="col-md-3 mb-3">
<label for="incoterm" class="form-label">INCOTERM</label> <label for="incoterm" class="form-label">INCOTERM</label>
<select id="incoterm" name="incoterm" class="form-select searchable" required> <select id="incoterm" name="incoterm" class="form-select searchable" required>
@@ -135,6 +160,7 @@
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</div> </div>
<div class="col-md-3 mb-3"> <div class="col-md-3 mb-3">
<label for="pais_proveedor" class="form-label">País (Proveedor)</label> <label for="pais_proveedor" class="form-label">País (Proveedor)</label>
<select id="pais_proveedor" name="pais_proveedor" class="form-select searchable" required> <select id="pais_proveedor" name="pais_proveedor" class="form-select searchable" required>
@@ -144,6 +170,7 @@
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</div> </div>
<div class="col-md-3 mb-3"> <div class="col-md-3 mb-3">
<label for="tipo_moneda" class="form-label">Moneda</label> <label for="tipo_moneda" class="form-label">Moneda</label>
<select id="tipo_moneda" name="tipo_moneda" class="form-select searchable" required> <select id="tipo_moneda" name="tipo_moneda" class="form-select searchable" required>
@@ -156,10 +183,11 @@
<!-- Valor y vinculación --> <!-- Valor y vinculación -->
<div class="row"> <div class="row">
<div class="col-md-8 mb-3"> <div class="col-md-8 mb-3 form-group-animated">
<label for="valor_factura" class="form-label">Valor Factura</label> <label for="valor_factura" class="form-label">Valor Factura</label>
<input id="valor_factura" name="valor_factura" type="number" step="0.01" min="0" class="form-control" required> <input id="valor_factura" name="valor_factura" type="number" step="0.01" min="0" class="form-control" required>
</div> </div>
<div class="col-md-4 mb-3"> <div class="col-md-4 mb-3">
<label for="vinculacion" class="form-label">Vinculación</label> <label for="vinculacion" class="form-label">Vinculación</label>
<select id="vinculacion" name="vinculacion" class="form-select searchable"> <select id="vinculacion" name="vinculacion" class="form-select searchable">
@@ -183,6 +211,7 @@
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</div> </div>
<div class="col-md-4 mb-3"> <div class="col-md-4 mb-3">
<label for="chofer_id" class="form-label">Chofer</label> <label for="chofer_id" class="form-label">Chofer</label>
<select id="chofer_id" name="chofer_id" class="form-select searchable" required> <select id="chofer_id" name="chofer_id" class="form-select searchable" required>
@@ -194,7 +223,8 @@
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</div> </div>
<div class="col-md-4 mb-3">
<div class="col-md-4 mb-3 form-group-animated">
<label for="foto_solicitud" class="form-label">Foto de la Carga (PIPA)</label> <label for="foto_solicitud" class="form-label">Foto de la Carga (PIPA)</label>
<input id="foto_solicitud" name="foto_solicitud" type="file" class="form-control" accept="image/*"> <input id="foto_solicitud" name="foto_solicitud" type="file" class="form-control" accept="image/*">
</div> </div>
@@ -202,9 +232,9 @@
<!-- Partidas dinámicas --> <!-- Partidas dinámicas -->
<hr> <hr>
<h5>📦 Partidas</h5> <h5 class="form-group-animated">📦 Partidas</h5>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-sm" id="tabla-partidas"> <table class="table table-sm form-group-animated" id="tabla-partidas">
<thead> <thead>
<tr> <tr>
<th>Descripción</th> <th>Descripción</th>
@@ -250,12 +280,14 @@
</td> </td>
<td class="hide"><input name="partidas[0][precio_unitario]" type="number" class="form-control w-auto"></td> <td class="hide"><input name="partidas[0][precio_unitario]" type="number" class="form-control w-auto"></td>
<td class="hide"><input name="partidas[0][oma_factura]" class="form-control w-auto"></td> <td class="hide"><input name="partidas[0][oma_factura]" class="form-control w-auto"></td>
<td><button type="button" class="btn btn-danger btn-sm remove-row">✖️</button></td> <td><button type="button" class="btn btn-danger btn-sm remove-row mt-auto w-auto btn-animated">✖️</button></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="form-group-animated">
<button type="button" class="btn btn-secondary btn-sm mt-auto w-auto btn-animated" id="add-partida"> Agregar partida</button> <button type="button" class="btn btn-secondary btn-sm mt-auto w-auto btn-animated" id="add-partida"> Agregar partida</button>
</div>
<!-- Activo --> <!-- Activo -->
<div class="form-check mt-4"> <div class="form-check mt-4">
@@ -264,8 +296,10 @@
</div> </div>
<!-- Botones finales --> <!-- Botones finales -->
<div class="text-end mt-4 form-group-animated">
<button type="submit" class="btn btn-success mt-3 mt-auto w-auto btn-animated">Guardar</button> <button type="submit" class="btn btn-success mt-3 mt-auto w-auto btn-animated">Guardar</button>
<a href="/IMPORTADORES/solicitud_importacion/lista" class="btn btn-secondary mt-3 ms-2 mt-auto w-auto btn-animated">Cancelar</a> <a href="/IMPORTADORES/solicitud_importacion/lista" class="btn btn-secondary mt-3 ms-2 mt-auto w-auto btn-animated">Cancelar</a>
</div>
</form> </form>
</div> </div>
</div> </div>
@@ -333,9 +367,9 @@
const row = document.createElement('tr'); const row = document.createElement('tr');
row.innerHTML = ` row.innerHTML = `
<td><input name="partidas[${idx}][descripcion]" class="form-control"></td> <td><input name="partidas[${idx}][descripcion]" class="form-control w-auto"></td>
<td><input name="partidas[${idx}][cantidad_comercial]" type="number" step="0.0001" class="form-control"></td> <td><input name="partidas[${idx}][cantidad_comercial]" type="number" step="0.0001" class="form-control w-auto"></td>
<td><input name="partidas[${idx}][cantidad_tarifa]" type="number" step="0.0001" class="form-control"></td> <td><input name="partidas[${idx}][cantidad_tarifa]" type="number" step="0.0001" class="form-control w-auto"></td>
<td> <td>
<select name="partidas[${idx}][unidad_comercial_id]" class="form-select searchable"> <select name="partidas[${idx}][unidad_comercial_id]" class="form-select searchable">
<option value="">-- Unidad --</option> <option value="">-- Unidad --</option>
@@ -344,17 +378,21 @@
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</td> </td>
<td><input name="partidas[${idx}][valor_factura]" type="number" step="0.01" class="form-control valor-partida"></td> <td><input name="partidas[${idx}][valor_factura]" type="number" step="0.01" class="form-control valor-partida w-auto"></td>
<td><input name="partidas[${idx}][peso_bruto]" type="number" step="0.0001" class="form-control"></td> <td><input name="partidas[${idx}][peso_bruto]" type="number" step="0.0001" class="form-control w-auto"></td>
<td> <td>
<select name="partidas[${idx}][tasa_preferencial]" class="form-select searchable"> <select name="partidas[${idx}][tasa_preferencial]" class="form-select searchable">
<option value="">-- Selecciona --</option> <option value="">-- Selecciona --</option>
<option>General</option><option>TLC</option><option>PROSEC</option><option>ALADI</option><option>COMERCIALIZADORA</option> <option>General</option>
<option>TLC</option>
<option>PROSEC</option>
<option>ALADI</option>
<option>COMERCIALIZADORA</option>
</select> </select>
</td> </td>
<td class="hide"><input name="partidas[${idx}][precio_unitario]" type="number" class="form-control"></td> <td class="hide"><input name="partidas[${idx}][precio_unitario]" type="number" class="form-control w-auto"></td>
<td class="hide"><input name="partidas[${idx}][oma_factura]" class="form-control"></td> <td class="hide"><input name="partidas[${idx}][oma_factura]" class="form-control w-auto"></td>
<td><button type="button" class="btn btn-danger btn-sm remove-row">✖️</button></td> <td><button type="button" class="btn btn-danger btn-sm remove-row mt-auto w-auto btn-animated">✖️</button></td>
`; `;
tbody.appendChild(row); tbody.appendChild(row);
@@ -398,9 +436,9 @@
if(Math.abs(sum - total) > 0.001){ if(Math.abs(sum - total) > 0.001){
e.preventDefault(); e.preventDefault();
Swal.fire({ Swal.fire({
icon:'error', icon: 'error',
title:'Error de validación', title: 'Error de validación',
text:`La suma de partidas (${sum.toFixed(2)}) no coincide con Valor Factura (${total.toFixed(2)}).` text: `La suma de partidas (${sum.toFixed(2)}) no coincide con Valor Factura (${total.toFixed(2)}).`
}); });
} }
}); });

View File

@@ -59,34 +59,58 @@
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); transition: left 0.5s; } background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); transition: left 0.5s; }
.btn-animated:hover::before { left: 100%; } .btn-animated:hover::before { left: 100%; }
.hide { display: none !important; } .hide { display: none !important; }
/* ========== ANIMACIONES PARA INPUTS TEXTO ========== */
.form-control:not(.no-animation) { transition: all 0.3s ease; border: 2px solid #dee2e6; position: relative; }
.form-control:not(.no-animation).shake { animation: shake 0.5s ease-in-out; }
@keyframes shake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-5px); }
75% { transform: translateX(5px); }
}
/* Animación para los campos del formulario */
.form-group-animated { opacity: 0; transform: translateY(20px); animation: slideUp 0.6s ease-out forwards; }
.form-group-animated:nth-child(1) { animation-delay: 0.1s; }
.form-group-animated:nth-child(2) { animation-delay: 0.2s; }
.form-group-animated:nth-child(3) { animation-delay: 0.3s; }
.form-group-animated:nth-child(4) { animation-delay: 0.4s; }
.form-group-animated:nth-child(5) { animation-delay: 0.5s; }
.form-group-animated:nth-child(6) { animation-delay: 0.6s; }
.form-group-animated:nth-child(7) { animation-delay: 0.7s; }
.form-group-animated:nth-child(8) { animation-delay: 0.8s; }
.form-group-animated:nth-child(9) { animation-delay: 0.9s; }
.form-group-animated:nth-child(10) { animation-delay: 1.0s; }
@keyframes slideUp { to { opacity: 1; transform: translateY(0); } }
</style> </style>
</head> </head>
<body> <body>
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✏️ Editar Solicitud #<?= (int)$factura['id_solicitud'] ?></h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✏️ Editar Solicitud #<?= (int)$factura['id_solicitud'] ?></h4>
<div class="card p-4 bg-white shadow-sm card-hover position-relative h-auto"> <div class="card p-4 bg-white shadow-sm card-hover position-relative h-auto fade-in-up">
<form id="solicitudForm" action="/IMPORTADORES/solicitud_importacion/actualizar" method="POST" enctype="multipart/form-data"> <form id="solicitudForm" action="/IMPORTADORES/solicitud_importacion/actualizar" method="POST" enctype="multipart/form-data">
<input type="hidden" name="id_solicitud" value="<?= (int)$factura['id_solicitud'] ?>"> <input type="hidden" name="id_solicitud" value="<?= (int)$factura['id_solicitud'] ?>">
<!-- Datos principales --> <!-- Datos principales -->
<div class="row"> <div class="row">
<div class="col-md-3 mb-3"> <div class="col-md-3 mb-3 form-group-animated">
<label for="numero_factura" class="form-label">Número de Factura</label> <label for="numero_factura" class="form-label">Número de Factura</label>
<input id="numero_factura" name="numero_factura" type="text" class="form-control" required <input id="numero_factura" name="numero_factura" type="text" class="form-control" required
value="<?= htmlspecialchars($factura['numero_factura']) ?>"> value="<?= htmlspecialchars($factura['numero_factura']) ?>">
</div> </div>
<div class="col-md-3 mb-3">
<div class="col-md-3 mb-3 form-group-animated">
<label for="fecha_factura" class="form-label">Fecha de Factura</label> <label for="fecha_factura" class="form-label">Fecha de Factura</label>
<input id="fecha_factura" name="fecha_factura" type="date" class="form-control" required <input id="fecha_factura" name="fecha_factura" type="date" class="form-control" required
value="<?= htmlspecialchars($factura['fecha_factura']) ?>"> value="<?= htmlspecialchars($factura['fecha_factura']) ?>">
</div> </div>
<div class="col-md-3 mb-3"> <div class="col-md-3 mb-3">
<label for="proveedor_id" class="form-label">Proveedor</label> <label for="proveedor_id" class="form-label">Proveedor</label>
<select id="proveedor_id" name="proveedor_clave" class="form-select searchable"> <select id="proveedor_id" name="proveedor_clave" class="form-select searchable">
<option value="">Cargando proveedores...</option> <option value="">Cargando proveedores...</option>
</select> </select>
</div> </div>
<div class="col-md-3 mb-3"> <div class="col-md-3 mb-3">
<label for="anexo22_apendice" class="form-label">Anexo 22 Apéndice</label> <label for="anexo22_apendice" class="form-label">Anexo 22 Apéndice</label>
<select id="anexo22_apendice" name="anexo22_apendice" class="form-select searchable" required> <select id="anexo22_apendice" name="anexo22_apendice" class="form-select searchable" required>
@@ -114,6 +138,7 @@
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</div> </div>
<div class="col-md-3 mb-3"> <div class="col-md-3 mb-3">
<label for="incoterm" class="form-label">INCOTERM</label> <label for="incoterm" class="form-label">INCOTERM</label>
<select id="incoterm" name="incoterm" class="form-select searchable" required> <select id="incoterm" name="incoterm" class="form-select searchable" required>
@@ -125,6 +150,7 @@
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</div> </div>
<div class="col-md-3 mb-3"> <div class="col-md-3 mb-3">
<label for="pais_proveedor" class="form-label">País (Proveedor)</label> <label for="pais_proveedor" class="form-label">País (Proveedor)</label>
<select id="pais_proveedor" name="pais_proveedor" class="form-select searchable"> <select id="pais_proveedor" name="pais_proveedor" class="form-select searchable">
@@ -136,6 +162,7 @@
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</div> </div>
<div class="col-md-3 mb-3"> <div class="col-md-3 mb-3">
<label for="tipo_moneda" class="form-label">Moneda</label> <label for="tipo_moneda" class="form-label">Moneda</label>
<select id="tipo_moneda" name="tipo_moneda" class="form-select searchable"> <select id="tipo_moneda" name="tipo_moneda" class="form-select searchable">
@@ -150,11 +177,12 @@
<!-- Valor y Vinculación --> <!-- Valor y Vinculación -->
<div class="row"> <div class="row">
<div class="col-md-8 mb-3"> <div class="col-md-8 mb-3 form-group-animated">
<label for="valor_factura" class="form-label">Valor Factura</label> <label for="valor_factura" class="form-label">Valor Factura</label>
<input id="valor_factura" name="valor_factura" type="number" step="0.01" min="0" class="form-control valor-total" required <input id="valor_factura" name="valor_factura" type="number" step="0.01" min="0" class="form-control valor-total" required
value="<?= htmlspecialchars($factura['valor_factura']) ?>"> value="<?= htmlspecialchars($factura['valor_factura']) ?>">
</div> </div>
<div class="col-md-4 mb-3"> <div class="col-md-4 mb-3">
<label for="vinculacion" class="form-label">Vinculación</label> <label for="vinculacion" class="form-label">Vinculación</label>
<select id="vinculacion" name="vinculacion" class="form-select searchable"> <select id="vinculacion" name="vinculacion" class="form-select searchable">
@@ -178,6 +206,7 @@
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</div> </div>
<div class="col-md-4 mb-3"> <div class="col-md-4 mb-3">
<label for="chofer_id" class="form-label">Chofer</label> <label for="chofer_id" class="form-label">Chofer</label>
<select id="chofer_id" name="chofer_id" class="form-select searchable" required> <select id="chofer_id" name="chofer_id" class="form-select searchable" required>
@@ -191,7 +220,8 @@
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</div> </div>
<div class="col-md-4 mb-3">
<div class="col-md-4 mb-3 form-group-animated">
<label for="foto_solicitud" class="form-label">Foto de la Carga (PIPA)</label> <label for="foto_solicitud" class="form-label">Foto de la Carga (PIPA)</label>
<input id="foto_solicitud" name="foto_solicitud" type="file" class="form-control" accept="image/*"> <input id="foto_solicitud" name="foto_solicitud" type="file" class="form-control" accept="image/*">
</div> </div>
@@ -199,9 +229,9 @@
<!-- Partidas Dinámicas --> <!-- Partidas Dinámicas -->
<hr> <hr>
<h5>📦 Partidas</h5> <h5 class="form-group-animated">📦 Partidas</h5>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-sm" id="tabla-partidas"> <table class="table table-sm form-group-animated" id="tabla-partidas">
<thead> <thead>
<tr> <tr>
<th>Descripción</th> <th>Descripción</th>
@@ -219,9 +249,9 @@
<tbody> <tbody>
<?php if (!empty($partidas)): foreach($partidas as $i=>$p): ?> <?php if (!empty($partidas)): foreach($partidas as $i=>$p): ?>
<tr> <tr>
<td><input name="partidas[<?= $i ?>][descripcion]" class="form-control" value="<?= htmlspecialchars($p['descripcion']) ?>"></td> <td><input name="partidas[<?= $i ?>][descripcion]" class="form-control w-auto" value="<?= htmlspecialchars($p['descripcion']) ?>"></td>
<td><input name="partidas[<?= $i ?>][cantidad_comercial]" type="number" step="0.0001" min="0" class="form-control" value="<?= htmlspecialchars($p['cantidad_comercial']) ?>"></td> <td><input name="partidas[<?= $i ?>][cantidad_comercial]" type="number" step="0.0001" min="0" class="form-control w-auto" value="<?= htmlspecialchars($p['cantidad_comercial']) ?>"></td>
<td><input name="partidas[<?= $i ?>][cantidad_tarifa]" type="number" step="0.0001" min="0" class="form-control" value="<?= htmlspecialchars($p['cantidad_tarifa']) ?>"></td> <td><input name="partidas[<?= $i ?>][cantidad_tarifa]" type="number" step="0.0001" min="0" class="form-control w-auto" value="<?= htmlspecialchars($p['cantidad_tarifa']) ?>"></td>
<td> <td>
<select name="partidas[<?= $i ?>][unidad_comercial_id]" class="form-select searchable"> <select name="partidas[<?= $i ?>][unidad_comercial_id]" class="form-select searchable">
<option value="">-- Unidad --</option> <option value="">-- Unidad --</option>
@@ -232,8 +262,8 @@
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</td> </td>
<td><input name="partidas[<?= $i ?>][valor_factura]" type="number" step="0.01" min="0" class="form-control valor-partida" value="<?= htmlspecialchars($p['valor_factura']) ?>"></td> <td><input name="partidas[<?= $i ?>][valor_factura]" type="number" step="0.01" min="0" class="form-control valor-partida w-auto" value="<?= htmlspecialchars($p['valor_factura']) ?>"></td>
<td><input name="partidas[<?= $i ?>][peso_bruto]" type="number" step="0.0001" min="0" class="form-control" value="<?= htmlspecialchars($p['peso_bruto']) ?>"></td> <td><input name="partidas[<?= $i ?>][peso_bruto]" type="number" step="0.0001" min="0" class="form-control w-auto" value="<?= htmlspecialchars($p['peso_bruto']) ?>"></td>
<td> <td>
<select name="partidas[<?= $i ?>][tasa_preferencial]" class="form-select searchable"> <select name="partidas[<?= $i ?>][tasa_preferencial]" class="form-select searchable">
<option value="">-- Selecciona --</option> <option value="">-- Selecciona --</option>
@@ -242,15 +272,15 @@
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</td> </td>
<td class="hide"><input name="partidas[<?= $i ?>][precio_unitario]" type="number" class="form-control" value="<?= htmlspecialchars($p['precio_unitario'] ?? '') ?>"></td> <td class="hide"><input name="partidas[<?= $i ?>][precio_unitario]" type="number" class="form-control w-auto" value="<?= htmlspecialchars($p['precio_unitario'] ?? '') ?>"></td>
<td class="hide"><input name="partidas[<?= $i ?>][oma_factura]" class="form-control" value="<?= htmlspecialchars($p['oma_factura'] ?? '') ?>"></td> <td class="hide"><input name="partidas[<?= $i ?>][oma_factura]" class="form-control w-auto" value="<?= htmlspecialchars($p['oma_factura'] ?? '') ?>"></td>
<td><button type="button" class="btn btn-danger btn-sm remove-row">✖️</button></td> <td><button type="button" class="btn btn-danger btn-sm remove-row mt-auto w-auto btn-animated">✖️</button></td>
</tr> </tr>
<?php endforeach; else: ?> <?php endforeach; else: ?>
<tr> <tr>
<td><input name="partidas[0][descripcion]" class="form-control"></td> <td><input name="partidas[0][descripcion]" class="form-control w-auto"></td>
<td><input name="partidas[0][cantidad_comercial]" type="number" step="0.0001" class="form-control" min="0"></td> <td><input name="partidas[0][cantidad_comercial]" type="number" step="0.0001" class="form-control w-auto" min="0"></td>
<td><input name="partidas[0][cantidad_tarifa]" type="number" step="0.0001" class="form-control" min="0"></td> <td><input name="partidas[0][cantidad_tarifa]" type="number" step="0.0001" class="form-control w-auto" min="0"></td>
<td> <td>
<select name="partidas[0][unidad_comercial_id]" class="form-select searchable"> <select name="partidas[0][unidad_comercial_id]" class="form-select searchable">
<option value="">-- Unidad --</option> <option value="">-- Unidad --</option>
@@ -259,8 +289,8 @@
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</td> </td>
<td><input name="partidas[0][valor_factura]" type="number" step="0.01" class="form-control valor-partida" min="0"></td> <td><input name="partidas[0][valor_factura]" type="number" step="0.01" class="form-control valor-partida w-auto" min="0"></td>
<td><input name="partidas[0][peso_bruto]" type="number" step="0.0001" class="form-control" min="0"></td> <td><input name="partidas[0][peso_bruto]" type="number" step="0.0001" class="form-control w-auto" min="0"></td>
<td> <td>
<select name="partidas[0][tasa_preferencial]" class="form-select searchable"> <select name="partidas[0][tasa_preferencial]" class="form-select searchable">
<option value="">-- Selecciona --</option> <option value="">-- Selecciona --</option>
@@ -268,15 +298,17 @@
<option>ALADI</option><option>COMERCIALIZADORA</option> <option>ALADI</option><option>COMERCIALIZADORA</option>
</select> </select>
</td> </td>
<td class="hide"><input name="partidas[0][precio_unitario]" type="number" class="form-control"></td> <td class="hide"><input name="partidas[0][precio_unitario]" type="number" class="form-control w-auto"></td>
<td class="hide"><input name="partidas[0][oma_factura]" class="form-control"></td> <td class="hide"><input name="partidas[0][oma_factura]" class="form-control w-auto"></td>
<td><button type="button" class="btn btn-danger btn-sm remove-row">✖️</button></td> <td><button type="button" class="btn btn-danger btn-sm remove-row mt-auto w-auto btn-animated">✖️</button></td>
</tr> </tr>
<?php endif; ?> <?php endif; ?>
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="form-group-animated">
<button type="button" class="btn btn-secondary btn-sm mb-3 mt-auto w-auto btn-animated" id="add-partida"> Agregar partida</button> <button type="button" class="btn btn-secondary btn-sm mb-3 mt-auto w-auto btn-animated" id="add-partida"> Agregar partida</button>
</div>
<!-- Activo --> <!-- Activo -->
<div class="form-check mb-4"> <div class="form-check mb-4">
@@ -284,8 +316,10 @@
<label for="status" class="hide form-check-label">Activo</label> <label for="status" class="hide form-check-label">Activo</label>
</div> </div>
<div class="text-end mt-4 form-group-animated">
<button type="submit" class="btn btn-success mt-auto w-auto btn-animated">Actualizar</button> <button type="submit" class="btn btn-success mt-auto w-auto btn-animated">Actualizar</button>
<a href="/IMPORTADORES/solicitud_importacion/lista" class="btn btn-secondary ms-2 mt-auto w-auto btn-animated">Cancelar</a> <a href="/IMPORTADORES/solicitud_importacion/lista" class="btn btn-secondary ms-2 mt-auto w-auto btn-animated">Cancelar</a>
</div>
</form> </form>
</div> </div>
</div> </div>
@@ -359,9 +393,9 @@
const row = document.createElement('tr'); const row = document.createElement('tr');
row.innerHTML = ` row.innerHTML = `
<td><input name="partidas[${idx}][descripcion]" class="form-control"></td> <td><input name="partidas[${idx}][descripcion]" class="form-control w-auto"></td>
<td><input name="partidas[${idx}][cantidad_comercial]" type="number" step="0.0001" class="form-control"></td> <td><input name="partidas[${idx}][cantidad_comercial]" type="number" step="0.0001" class="form-control w-auto"></td>
<td><input name="partidas[${idx}][cantidad_tarifa]" type="number" step="0.0001" class="form-control"></td> <td><input name="partidas[${idx}][cantidad_tarifa]" type="number" step="0.0001" class="form-control w-auto"></td>
<td> <td>
<select name="partidas[${idx}][unidad_comercial_id]" class="form-select searchable"> <select name="partidas[${idx}][unidad_comercial_id]" class="form-select searchable">
<option value="">-- Unidad --</option> <option value="">-- Unidad --</option>
@@ -370,8 +404,8 @@
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</td> </td>
<td><input name="partidas[${idx}][valor_factura]" type="number" step="0.01" class="form-control valor-partida"></td> <td><input name="partidas[${idx}][valor_factura]" type="number" step="0.01" class="form-control valor-partida w-auto"></td>
<td><input name="partidas[${idx}][peso_bruto]" type="number" step="0.0001" class="form-control"></td> <td><input name="partidas[${idx}][peso_bruto]" type="number" step="0.0001" class="form-control w-auto"></td>
<td> <td>
<select name="partidas[${idx}][tasa_preferencial]" class="form-select searchable"> <select name="partidas[${idx}][tasa_preferencial]" class="form-select searchable">
<option value="">-- Selecciona --</option> <option value="">-- Selecciona --</option>
@@ -382,9 +416,9 @@
<option>COMERCIALIZADORA</option> <option>COMERCIALIZADORA</option>
</select> </select>
</td> </td>
<td class="hide"><input name="partidas[${idx}][precio_unitario]" type="number" class="form-control"></td> <td class="hide"><input name="partidas[${idx}][precio_unitario]" type="number" class="form-control w-auto"></td>
<td class="hide"><input name="partidas[${idx}][oma_factura]" class="form-control"></td> <td class="hide"><input name="partidas[${idx}][oma_factura]" class="form-control w-auto"></td>
<td><button type="button" class="btn btn-danger btn-sm remove-row">✖️</button></td> <td><button type="button" class="btn btn-danger btn-sm remove-row mt-auto w-auto btn-animated">✖️</button></td>
`; `;
tbody.appendChild(row); tbody.appendChild(row);

View File

@@ -86,10 +86,10 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">📄 Solicitudes de Importación</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">📄 Solicitudes de Importación</h4>
<a href="/IMPORTADORES/solicitud_importacion/crear" class="btn btn-success mb-3 mt-auto w-auto btn-animated"> Nueva Solicitud</a> <a href="/IMPORTADORES/solicitud_importacion/crear" class="btn btn-success mb-3 mt-auto w-auto btn-animated fade-in-up"> Nueva Solicitud</a>
<button class="btn btn-warning mb-3 mt-auto w-auto btn-animated" id="btn-solicitar-masivo">🚚 Solicitar Importación Masiva</button> <button class="btn btn-warning mb-3 mt-auto w-auto btn-animated fade-in-up" id="btn-solicitar-masivo">🚚 Solicitar Importación Masiva</button>
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped" id="tabla-solicitudes"> <table class="table table-striped" id="tabla-solicitudes">
<thead> <thead>

View File

@@ -170,7 +170,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow"> Nuevo Transporte</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow"> Nuevo Transporte</h4>
<form id="formTransCrear" action="/IMPORTADORES/transportes/guardar" method="POST" enctype="multipart/form-data" class="card p-4 shadow-sm card-hover position-relative h-auto"> <form id="formTransCrear" action="/IMPORTADORES/transportes/guardar" method="POST" enctype="multipart/form-data" class="card p-4 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="row g-3"> <div class="row g-3">
<div class="col-md-6 form-group-animated"> <div class="col-md-6 form-group-animated">

View File

@@ -164,7 +164,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✏️ Editar Transporte #<?= $t['id_transporte'] ?></h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✏️ Editar Transporte #<?= $t['id_transporte'] ?></h4>
<form id="formTransEdit" action="/IMPORTADORES/transportes/actualizar" method="POST" enctype="multipart/form-data" class="card p-4 shadow-sm card-hover position-relative h-auto"> <form id="formTransEdit" action="/IMPORTADORES/transportes/actualizar" method="POST" enctype="multipart/form-data" class="card p-4 shadow-sm card-hover position-relative h-auto fade-in-up">
<input type="hidden" name="id_transporte" value="<?= $t['id_transporte'] ?>"> <input type="hidden" name="id_transporte" value="<?= $t['id_transporte'] ?>">
<div class="row g-3"> <div class="row g-3">
<div class="col-md-6 form-group-animated"> <div class="col-md-6 form-group-animated">

View File

@@ -81,7 +81,7 @@
</script> </script>
<?php endif; ?> <?php endif; ?>
<div class="card p-4 shadow-sm card-hover position-relative h-auto"> <div class="card p-4 shadow-sm card-hover position-relative h-auto fade-in-up">
<form action="/IMPORTADORES/transportes/importarGuardar" method="POST" enctype="multipart/form-data"> <form action="/IMPORTADORES/transportes/importarGuardar" method="POST" enctype="multipart/form-data">
<div class="mb-3"> <div class="mb-3">
<label class="form-label">Archivo CSV *</label> <label class="form-label">Archivo CSV *</label>

View File

@@ -67,8 +67,8 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🚛 Mis Transportes</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🚛 Mis Transportes</h4>
<a href="/IMPORTADORES/transportes/crear" class="btn btn-success mb-3 mt-auto w-auto btn-animated"> Nuevo Transporte</a> <a href="/IMPORTADORES/transportes/crear" class="btn btn-success mb-3 mt-auto w-auto btn-animated fade-in-up"> Nuevo Transporte</a>
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped" id="tabla-transportes"> <table class="table table-striped" id="tabla-transportes">
<thead> <thead>

View File

@@ -150,7 +150,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow"> Alta de Transportista</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow"> Alta de Transportista</h4>
<form action="/IMPORTADORES/transportistas/guardar" method="POST" class="card p-4 shadow-sm card-hover position-relative h-auto" id="formAltaTransportista"> <form action="/IMPORTADORES/transportistas/guardar" method="POST" class="card p-4 shadow-sm card-hover position-relative h-auto fade-in-up" id="formAltaTransportista">
<!-- Hidden para persona moral --> <!-- Hidden para persona moral -->
<input type="hidden" name="es_persona_moral" id="es_persona_moral" value="0"> <input type="hidden" name="es_persona_moral" id="es_persona_moral" value="0">

View File

@@ -79,7 +79,7 @@ unset($_SESSION['import_errors'], $_SESSION['import_success']);
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">📂 Carga Masiva de Transportistas</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">📂 Carga Masiva de Transportistas</h4>
<div class="card p-4 shadow-sm card-hover position-relative h-auto"> <div class="card p-4 shadow-sm card-hover position-relative h-auto fade-in-up">
<p>1. Descarga la plantilla, complétala con tus datos y luego súbela aquí.</p> <p>1. Descarga la plantilla, complétala con tus datos y luego súbela aquí.</p>
<a href="/IMPORTADORES/transportistas/template" class="btn btn-outline-secondary mb-4"> <a href="/IMPORTADORES/transportistas/template" class="btn btn-outline-secondary mb-4">
📥 Descargar Plantilla CSV 📥 Descargar Plantilla CSV

View File

@@ -157,7 +157,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✏️ Editar Transportista #<?= $t['id_transportista'] ?></h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✏️ Editar Transportista #<?= $t['id_transportista'] ?></h4>
<form action="/IMPORTADORES/transportistas/actualizar" method="POST" class="card p-4 shadow-sm card-hover position-relative h-auto" id="formEditTransportista"> <form action="/IMPORTADORES/transportistas/actualizar" method="POST" class="card p-4 shadow-sm card-hover position-relative h-auto fade-in-up" id="formEditTransportista">
<input type="hidden" name="id_transportista" value="<?= $t['id_transportista'] ?>"> <input type="hidden" name="id_transportista" value="<?= $t['id_transportista'] ?>">
<div class="row g-3"> <div class="row g-3">
<div class="col-md-4 form-group-animated"> <div class="col-md-4 form-group-animated">

View File

@@ -64,8 +64,8 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🚚 Mis Transportistas</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🚚 Mis Transportistas</h4>
<a href="/IMPORTADORES/transportistas/alta" class="btn btn-success mb-3 mt-auto w-auto btn-animated"> Nuevo Transportista</a> <a href="/IMPORTADORES/transportistas/alta" class="btn btn-success mb-3 mt-auto w-auto btn-animated fade-in-up"> Nuevo Transportista</a>
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table id="transportistas-table" class="display nowrap" style="width:100%"> <table id="transportistas-table" class="display nowrap" style="width:100%">
<thead> <thead>

View File

@@ -67,7 +67,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✅ Importadores Vinculados</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">✅ Importadores Vinculados</h4>
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped" id="tabla-importadores-vinculados"> <table class="table table-striped" id="tabla-importadores-vinculados">
<thead> <thead>

View File

@@ -69,7 +69,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow"> Nueva Vinculación</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow"> Nueva Vinculación</h4>
<!-- TABLA DE AGENCIAS --> <!-- TABLA DE AGENCIAS -->
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<h5 class="mb-3">🔗 Solicitar Vinculación con Agencias Aduanales</h5> <h5 class="mb-3">🔗 Solicitar Vinculación con Agencias Aduanales</h5>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped table-hover align-middle" id="tabla-solicitar-vinculaciones"> <table class="table table-striped table-hover align-middle" id="tabla-solicitar-vinculaciones">

View File

@@ -66,7 +66,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🔗 Solicitudes de Vinculación</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🔗 Solicitudes de Vinculación</h4>
<!-- TABLA DE SOLICITUDES DE VINCULACIÓN --> <!-- TABLA DE SOLICITUDES DE VINCULACIÓN -->
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<h5 class="mb-3">👥 Usuarios Solicitantes</h5> <h5 class="mb-3">👥 Usuarios Solicitantes</h5>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped table-hover align-middle" id="tabla-vinculaciones-pendientes"> <table class="table table-striped table-hover align-middle" id="tabla-vinculaciones-pendientes">

View File

@@ -67,7 +67,7 @@
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">👥 Usuarios Vinculados</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">👥 Usuarios Vinculados</h4>
<!-- TABLA DE VINCULACIÓN AGENCIA --> <!-- TABLA DE VINCULACIÓN AGENCIA -->
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped table-hover align-middle" id="tabla-vinculaciones-agencia"> <table class="table table-striped table-hover align-middle" id="tabla-vinculaciones-agencia">
<thead> <thead>

View File

@@ -68,9 +68,9 @@
<!-- 📄 CONTENIDO --> <!-- 📄 CONTENIDO -->
<div class="content"> <div class="content">
<h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🔗 Mis vinculaciones</h4> <h4 class="mb-4 animate__animated animate__fadeInDown title_glow">🔗 Mis vinculaciones</h4>
<a href="/IMPORTADORES/vinculaciones/nuevaVinculacion" class="btn btn-success mb-3 mt-auto w-auto btn-animated"> Nueva Vinculación</a> <a href="/IMPORTADORES/vinculaciones/nuevaVinculacion" class="btn btn-success mb-3 mt-auto w-auto btn-animated fade-in-up"> Nueva Vinculación</a>
<!-- TABLA DE VINCULACIÓN USUARIO --> <!-- TABLA DE VINCULACIÓN USUARIO -->
<div class="card p-3 shadow-sm card-hover position-relative h-auto"> <div class="card p-3 shadow-sm card-hover position-relative h-auto fade-in-up">
<h5 class="mb-3">🏪 Agencia Vinculadas</h5> <h5 class="mb-3">🏪 Agencia Vinculadas</h5>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped table-hover align-middle" id="tabla-vinculaciones-usuario"> <table class="table table-striped table-hover align-middle" id="tabla-vinculaciones-usuario">