fix: version 3.1.2 -- Panel sin datos de proyectos para usuarios sin ese modulo

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Milton Gonzalez
2026-10-23 14:33:41 -05:00
parent 72890e37d9
commit c64a16064f
8 changed files with 29 additions and 5 deletions
+5
View File
@@ -1,5 +1,10 @@
# Changelog - project.linkedcorp.net
## [3.1.2] - 2026-10-23
### Fixed
- Panel: un usuario sin el módulo Proyectos ya no ve KPIs ni detalle de proyectos; ve solo una
bienvenida. El backend bloquea `/api/dashboard/*` con 403 sin ese módulo.
## [3.1.1] - 2026-10-23
### Fixed
- El popup de actualización quedaba en "Reiniciando servicios" hasta agotar los 10 minutos: el
-2
View File
@@ -176,8 +176,6 @@ y recargar. Pendiente verificar el flujo completo en un despliegue autorizado; n
roles fijos codificados).
- Integracion IA (API Claude) — ideas: plan de proyecto generado desde una descripcion, resumen
semanal del Panel. Clave cifrada en `system_settings` como el SMTP; la IA solo sugiere.
- Panel: con el modulo Proyectos deshabilitado, los KPIs del Panel siguen mostrando datos de
proyectos del usuario (revisar si se deben ocultar).
- Notificaciones por email/WhatsApp (hoy: solo in-app).
- Job programado para detectar actividades vencidas/por vencer (hoy: solo se notifica al asignar).
- DatePicker: sigue usando `<input type="date">` nativo (simplificacion deliberada del MVP).
+1 -1
View File
@@ -1 +1 @@
3.1.1
3.1.2
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "project-linkedcorp-backend",
"version": "3.1.1",
"version": "3.1.2",
"private": true,
"type": "module",
"main": "src/server.js",
+2
View File
@@ -1,10 +1,12 @@
import { Router } from 'express';
import { requireAuth } from '../../middleware/auth.js';
import { requireModule } from '../../middleware/modules.js';
import { getSummary, getCalendar } from './controller.js';
const router = Router();
router.use(requireAuth);
router.use(requireModule('projects'));
router.get('/summary', getSummary);
router.get('/calendar', getCalendar);
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "project-linkedcorp-frontend",
"private": true,
"version": "3.1.1",
"version": "3.1.2",
"type": "module",
"scripts": {
"dev": "vite",
+2
View File
@@ -5,6 +5,7 @@ export const messages = {
user_modules: 'Módulos',
user_modules_hint: 'Marca los módulos que este usuario puede usar. Lo que no esté marcado no aparece en su menú y el sistema le niega el acceso.',
user_modules_saved: 'Módulos actualizados. El usuario verá el cambio al recargar.',
dashboard_no_projects_module: 'Bienvenido. Usa el menú de la izquierda para ir a los módulos que tienes habilitados.',
nav_projects: 'Proyectos',
nav_organization: 'Organizacion',
nav_config: 'Configuracion',
@@ -527,6 +528,7 @@ export const messages = {
user_modules: 'Modules',
user_modules_hint: 'Check the modules this user can use. Unchecked modules are hidden from their menu and access is denied.',
user_modules_saved: 'Modules updated. The user will see the change after reloading.',
dashboard_no_projects_module: 'Welcome. Use the menu on the left to open the modules enabled for you.',
nav_projects: 'Projects',
nav_organization: 'Organization',
nav_config: 'Settings',
@@ -2,6 +2,7 @@ import { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { useUi } from '../../context/ui-context.jsx';
import { useAuth } from '../../context/auth-context.jsx';
import { hasModule } from '../../utils/modules.js';
import { useAsync } from '../../hooks/useAsync.js';
import { getSummary } from '../../services/dashboard.js';
import { KpiCard } from '../../components/KpiCard.jsx';
@@ -78,7 +79,23 @@ function ActivityRows({ activities, onOpen }) {
));
}
// Todo el Panel son datos de proyectos: sin ese modulo se muestra solo la bienvenida, sin llamar
// a /dashboard (que el backend tambien bloquea con 403).
export default function DashboardPage() {
const { t } = useUi();
const { user } = useAuth();
if (!hasModule(user, 'projects')) {
return (
<div>
<h2 className="page-title mt-0">{t('dashboard_title')}</h2>
<p className="text-muted">{t('dashboard_no_projects_module')}</p>
</div>
);
}
return <ProjectsDashboard />;
}
function ProjectsDashboard() {
const { t } = useUi();
const navigate = useNavigate();
const { user } = useAuth();