diff --git a/CHANGELOG.md b/CHANGELOG.md index e8257a3..9df8d72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/ESTADO.md b/ESTADO.md index a920856..3120555 100644 --- a/ESTADO.md +++ b/ESTADO.md @@ -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 `` nativo (simplificacion deliberada del MVP). diff --git a/VERSION b/VERSION index 94ff29c..ef538c2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.1.1 +3.1.2 diff --git a/backend/package.json b/backend/package.json index 9ff42af..72ae212 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "project-linkedcorp-backend", - "version": "3.1.1", + "version": "3.1.2", "private": true, "type": "module", "main": "src/server.js", diff --git a/backend/src/modules/dashboard/routes.js b/backend/src/modules/dashboard/routes.js index 7ab123d..35aac57 100644 --- a/backend/src/modules/dashboard/routes.js +++ b/backend/src/modules/dashboard/routes.js @@ -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); diff --git a/frontend/package.json b/frontend/package.json index a5d5b6e..0eba7a6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "project-linkedcorp-frontend", "private": true, - "version": "3.1.1", + "version": "3.1.2", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/src/i18n/messages.js b/frontend/src/i18n/messages.js index 61a009a..ac22efa 100644 --- a/frontend/src/i18n/messages.js +++ b/frontend/src/i18n/messages.js @@ -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', diff --git a/frontend/src/pages/Dashboard/DashboardPage.jsx b/frontend/src/pages/Dashboard/DashboardPage.jsx index e7214a3..5359079 100644 --- a/frontend/src/pages/Dashboard/DashboardPage.jsx +++ b/frontend/src/pages/Dashboard/DashboardPage.jsx @@ -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 ( +
+

{t('dashboard_title')}

+

{t('dashboard_no_projects_module')}

+
+ ); + } + return ; +} + +function ProjectsDashboard() { const { t } = useUi(); const navigate = useNavigate(); const { user } = useAuth();