Usuario vendedor y pestaña descargas

This commit is contained in:
2026-06-05 23:14:20 -05:00
parent 984f2f103d
commit 21889a3761
7 changed files with 238 additions and 29 deletions
+67 -21
View File
@@ -10,13 +10,15 @@
const TABS = [
{ id: 'productos', label: 'Productos', icon: '📦' },
{ id: 'agotados', label: 'Agotados', icon: '🚫' },
{ id: 'descargas', label: 'Descargas', icon: '⬇️' },
{ id: 'categorias', label: 'Categorías', icon: '🗂️' },
{ id: 'usuarios', label: 'Usuarios', icon: '👥' }
];
const ROLES = {
admin: 'Administrador',
editor: 'Editor'
admin: 'Administrador',
editor: 'Editor',
vendedor: 'Vendedor'
};
// Iconos disponibles para categorías
@@ -41,6 +43,7 @@ document.addEventListener('DOMContentLoaded', async () => {
setupLoginForm();
setupLogout();
setupNavigation();
setupSubtabs();
setupModals();
setupPermisosToggles();
setupCategoriasModals();
@@ -94,19 +97,28 @@ function mostrarDashboard(user) {
// Aplicar permisos (visibilidad de nav, subsección admin-only, etc.)
aplicarPermisos();
// Reset a la vista dashboard
cambiarVista('dashboard');
// Determinar vista inicial
const esAdmin = user.rol === 'admin';
const perms = getPermisosEfectivos();
let viewInicial;
if (esAdmin || perms.includes('dashboard')) {
viewInicial = 'dashboard';
} else {
// Primera vista visible según permisos
viewInicial = perms[0] || 'descargas';
}
cambiarVista(viewInicial);
cargarEstadisticas();
}
function cambiarVista(view) {
// Check defensivo: si el usuario no tiene permiso para esta vista, redirige a dashboard
if (currentUser && view !== 'dashboard') {
// Check defensivo: si el usuario no tiene permiso para esta vista, redirige a la primera vista visible
if (currentUser) {
const esAdmin = currentUser.rol === 'admin';
const permisos = currentUser.permisos || [];
if (!esAdmin && !permisos.includes(view)) {
view = 'dashboard';
const perms = getPermisosEfectivos();
if (!esAdmin && !perms.includes(view)) {
view = perms[0] || 'descargas';
}
}
@@ -150,6 +162,10 @@ function cambiarVista(view) {
if (view === 'agotados') {
cargarAgotados();
}
if (view === 'descargas') {
cargarDescargas();
}
}
async function cargarEstadisticas() {
@@ -172,27 +188,28 @@ async function cargarEstadisticas() {
// ════════════════════════════════
// PERMISOS — visibilidad según rol + permisos[]
// Vendedor: SIEMPRE ve 'descargas' (implícito) + lo que le hayan dado
// ════════════════════════════════
function getPermisosEfectivos() {
if (!currentUser) return [];
const permisos = currentUser.permisos || [];
if (currentUser.rol === 'vendedor' && !permisos.includes('descargas')) {
return ['descargas', ...permisos];
}
return permisos;
}
function aplicarPermisos() {
if (!currentUser) return;
const esAdmin = currentUser.rol === 'admin';
const permisos = currentUser.permisos || [];
const puedeGestionarUsuarios = esAdmin || permisos.includes('usuarios');
const perms = getPermisosEfectivos();
const puedeGestionarUsuarios = esAdmin || perms.includes('usuarios');
// Mostrar/ocultar cada nav-item según permisos
document.querySelectorAll('.nav-item[data-view]').forEach(item => {
const view = item.dataset.view;
let visible = false;
if (view === 'dashboard') {
visible = true; // Dashboard siempre visible
} else if (esAdmin) {
visible = true; // Admin ve todo
} else {
visible = permisos.includes(view); // Editor: solo sus permisos
}
const visible = esAdmin || perms.includes(view);
item.style.display = visible ? '' : 'none';
});
@@ -220,6 +237,35 @@ function setupNavigation() {
});
}
// ════════════════════════════════
// SUBTABS (dentro de la view 'descargas')
// ════════════════════════════════
function setupSubtabs() {
document.querySelectorAll('.subtab').forEach(btn => {
btn.addEventListener('click', () => {
const subtab = btn.dataset.subtab;
// Activar solo este botón
btn.parentElement.querySelectorAll('.subtab').forEach(b => {
b.classList.toggle('active', b === btn);
b.setAttribute('aria-selected', b === btn ? 'true' : 'false');
});
// Mostrar solo el panel correspondiente
document.querySelectorAll('.subtab-panel').forEach(p => {
p.classList.toggle('active', p.dataset.subtabPanel === subtab);
});
});
});
}
// ════════════════════════════════
// DESCARGAS (vista + subtabs pdf / fotos)
// Funcionalidad TBD — placeholders por ahora
// ════════════════════════════════
function cargarDescargas() {
// Placeholder. Cuando se implemente cada subpestaña, se cargan
// los datos del backend (PDFs disponibles, lotes de fotos, etc.).
}
// ════════════════════════════════
// PERMISOS EN MODALES — render y lectura
// ════════════════════════════════