diff --git a/CHANGELOG.md b/CHANGELOG.md
index d3f0801..a208b77 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,14 @@
# Changelog - project.linkedcorp.net
+## [2.11.1] - 2026-10-14
+### Fixed
+- La 2.11.0 puso los contadores de dependencias/comentarios/documentos/miembros como columnas
+ nuevas en las grillas de Proyectos y Actividades — no era lo pedido, desbordaba la tabla.
+ Se quitan esas columnas y los contadores van donde correspondía: como badge junto al nombre
+ de cada pestaña (Miembros, Actividades, Comentarios, Documentos del proyecto; Dependencias,
+ Comentarios, Documentos de la actividad), al mismo estilo que ya usaba "Tareas n/n". De paso
+ se corrige que el badge de una pestaña se ocultaba en 0 en vez de mostrarlo.
+
## [2.11.0] - 2026-10-14
### Added
- Listado de Actividades (dentro de un proyecto): columnas nuevas con el número de
diff --git a/VERSION b/VERSION
index 46b81d8..6ceb272 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.11.0
+2.11.1
diff --git a/backend/package.json b/backend/package.json
index 50cd47f..65a74f3 100644
--- a/backend/package.json
+++ b/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "project-linkedcorp-backend",
- "version": "2.11.0",
+ "version": "2.11.1",
"private": true,
"type": "module",
"main": "src/server.js",
diff --git a/frontend/package.json b/frontend/package.json
index ba6d4af..b066749 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,7 +1,7 @@
{
"name": "project-linkedcorp-frontend",
"private": true,
- "version": "2.11.0",
+ "version": "2.11.1",
"type": "module",
"scripts": {
"dev": "vite",
diff --git a/frontend/src/components/AttachmentsPanel.jsx b/frontend/src/components/AttachmentsPanel.jsx
index 99f6b6c..49e9b06 100644
--- a/frontend/src/components/AttachmentsPanel.jsx
+++ b/frontend/src/components/AttachmentsPanel.jsx
@@ -13,7 +13,7 @@ import hljsDark from 'highlight.js/styles/vs2015.css?inline';
const VIEWABLE_MIME = new Set(['text/plain', 'text/markdown']);
-export function AttachmentsPanel({ entityType, entityId }) {
+export function AttachmentsPanel({ entityType, entityId, onChanged }) {
const { t, openDialog, theme } = useUi();
const runAction = useAction();
const { data: files, reload } = useAsync(() => listAttachments(entityType, entityId), [entityType, entityId]);
@@ -41,6 +41,7 @@ export function AttachmentsPanel({ entityType, entityId }) {
await runAction(async () => {
await uploadAttachment(entityType, entityId, file);
await reload();
+ onChanged?.(); // refresca el contador de la pestaña "Documentos" en el padre
});
e.target.value = '';
}
@@ -52,7 +53,7 @@ export function AttachmentsPanel({ entityType, entityId }) {
message: t('common_confirm_delete_msg'),
actions: [
{ label: t('common_cancel'), variant: 'standard' },
- { label: t('common_delete'), variant: 'danger', onClick: () => runAction(async () => { await deleteAttachment(file.id); await reload(); }) },
+ { label: t('common_delete'), variant: 'danger', onClick: () => runAction(async () => { await deleteAttachment(file.id); await reload(); onChanged?.(); }) },
],
});
}
diff --git a/frontend/src/components/CommentsPanel.jsx b/frontend/src/components/CommentsPanel.jsx
index 0a4e9e6..f24f6d2 100644
--- a/frontend/src/components/CommentsPanel.jsx
+++ b/frontend/src/components/CommentsPanel.jsx
@@ -5,7 +5,7 @@ import { useAsync, useAction } from '../hooks/useAsync.js';
import { listComments, createComment } from '../services/comments.js';
import { Button } from './Button.jsx';
-export function CommentsPanel({ entityType, entityId }) {
+export function CommentsPanel({ entityType, entityId, onChanged }) {
const { t } = useUi();
const runAction = useAction();
const { data: comments, reload } = useAsync(() => listComments(entityType, entityId), [entityType, entityId]);
@@ -17,6 +17,7 @@ export function CommentsPanel({ entityType, entityId }) {
await createComment(entityType, entityId, message.trim());
setMessage('');
await reload();
+ onChanged?.(); // refresca el contador de la pestaña "Comentarios" en el padre
});
}
diff --git a/frontend/src/components/CountBadge.jsx b/frontend/src/components/CountBadge.jsx
deleted file mode 100644
index c264c18..0000000
--- a/frontend/src/components/CountBadge.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-// Contador chico con icono para columnas de listado (dependencias/comentarios/documentos/
-// miembros). Siempre muestra el numero, incluido 0 -- a diferencia de SharedWithIcon/Tabs que
-// ocultan el badge en 0, aca el pedido es que el contador siempre sea visible.
-export function CountBadge({ icon: Icon, count, title }) {
- return (
-
-
- {count}
-
- );
-}
diff --git a/frontend/src/components/Tabs.jsx b/frontend/src/components/Tabs.jsx
index 5c6182d..98497aa 100644
--- a/frontend/src/components/Tabs.jsx
+++ b/frontend/src/components/Tabs.jsx
@@ -4,7 +4,9 @@ export function Tabs({ tabs, active, onChange }) {
{tabs.map((tab) => (
))}
diff --git a/frontend/src/pages/Proyectos/ActivityDetailPanel.jsx b/frontend/src/pages/Proyectos/ActivityDetailPanel.jsx
index 1b6bc8d..d393f63 100644
--- a/frontend/src/pages/Proyectos/ActivityDetailPanel.jsx
+++ b/frontend/src/pages/Proyectos/ActivityDetailPanel.jsx
@@ -153,7 +153,7 @@ export default function ActivityDetailPanel({ activity, projectId, siblingActivi
tabs={[
{ key: 'detail', label: t('tab_info') },
{ key: 'tasks', label: t('tasks_title'), count: tasksTabCount },
- { key: 'dependencies', label: t('activity_dependencies') },
+ { key: 'dependencies', label: t('activity_dependencies'), count: (activity.dependencies || []).length },
{ key: 'comments', label: t('tab_comments'), count: (comments || []).length },
{ key: 'documents', label: t('tab_documents'), count: (attachments || []).length },
]}
diff --git a/frontend/src/pages/Proyectos/ProjectActivitiesTab.jsx b/frontend/src/pages/Proyectos/ProjectActivitiesTab.jsx
index e89a0d4..14fafec 100644
--- a/frontend/src/pages/Proyectos/ProjectActivitiesTab.jsx
+++ b/frontend/src/pages/Proyectos/ProjectActivitiesTab.jsx
@@ -1,6 +1,6 @@
import { useEffect, useRef, useState } from 'react';
import { useNavigate } from 'react-router-dom';
-import { Plus, Save, Trash2, ArrowRightLeft, FolderUp, Archive, RotateCcw, Link2, MessageSquare, Paperclip } from 'lucide-react';
+import { Plus, Save, Trash2, ArrowRightLeft, FolderUp, Archive, RotateCcw } from 'lucide-react';
import { useUi } from '../../context/ui-context.jsx';
import { useAuth } from '../../context/auth-context.jsx';
import { useAsync, useAction } from '../../hooks/useAsync.js';
@@ -19,7 +19,6 @@ import { ComboBox } from '../../components/ComboBox.jsx';
import { StatusBadge, ProgressBar, DueBadge } from '../../components/StatusBadge.jsx';
import { dueStatus } from '../../utils/dueStatus.js';
import { DetailPopup } from '../../components/DetailPopup.jsx';
-import { CountBadge } from '../../components/CountBadge.jsx';
import ActivityDetailPanel from './ActivityDetailPanel.jsx';
const EMPTY_FORM = { name: '', description: '', responsibleUserId: '', priorityId: '', statusId: '', startDate: '', dueDate: '', isMilestone: false };
@@ -213,9 +212,6 @@ export default function ProjectActivitiesTab({ project, projectId, openActivityI
) },
{ key: 'progress_pct', label: t('activity_progress'), render: (r) =>
},
- { key: 'dependencies_count', label: t('activity_dependencies'), render: (r) => },
- { key: 'comments_count', label: t('tab_comments'), render: (r) => },
- { key: 'documents_count', label: t('tab_documents'), render: (r) => },
{ key: 'updated_at', label: t('activity_updated_at'), render: (r) => {String(r.updated_at).slice(0, 16)} },
];
diff --git a/frontend/src/pages/Proyectos/ProyectoDetallePage.jsx b/frontend/src/pages/Proyectos/ProyectoDetallePage.jsx
index 8bcae8f..081339a 100644
--- a/frontend/src/pages/Proyectos/ProyectoDetallePage.jsx
+++ b/frontend/src/pages/Proyectos/ProyectoDetallePage.jsx
@@ -44,12 +44,12 @@ export default function ProyectoDetallePage() {
}
{tab === 'calendar' && }
- {tab === 'comments' && }
- {tab === 'documents' && }
+ {tab === 'comments' && }
+ {tab === 'documents' && }
);
}
diff --git a/frontend/src/pages/Proyectos/ProyectosPage.jsx b/frontend/src/pages/Proyectos/ProyectosPage.jsx
index 256f773..a0a92b1 100644
--- a/frontend/src/pages/Proyectos/ProyectosPage.jsx
+++ b/frontend/src/pages/Proyectos/ProyectosPage.jsx
@@ -1,6 +1,6 @@
import { useState } from 'react';
import { useNavigate } from 'react-router-dom';
-import { Plus, Save, Trash2, RotateCcw, ArrowLeft, Users, ListChecks, MessageSquare, Paperclip } from 'lucide-react';
+import { Plus, Save, Trash2, RotateCcw, ArrowLeft } from 'lucide-react';
import { useUi } from '../../context/ui-context.jsx';
import { useAuth } from '../../context/auth-context.jsx';
import { useAsync, useAction } from '../../hooks/useAsync.js';
@@ -20,7 +20,6 @@ import { StatusBadge, ProgressBar } from '../../components/StatusBadge.jsx';
import { Badge } from '../../components/Badge.jsx';
import { DetailPopup } from '../../components/DetailPopup.jsx';
import { SharedWithIcon } from '../../components/SharedWithIcon.jsx';
-import { CountBadge } from '../../components/CountBadge.jsx';
const CAN_DELETE_ROLES = ['superadmin', 'admin', 'it_manager', 'project_lead'];
@@ -170,13 +169,7 @@ export default function ProyectosPage() {
{ key: 'status_name', label: t('common_status'), render: (r) => },
{ key: 'priority_name', label: t('common_priority'), sortValue: (r) => r.priority_level, render: (r) => },
{ key: 'owner_name', label: t('project_owner') },
- { key: 'members_count', label: t('project_members'), render: (r) => },
{ key: 'progress_pct', label: t('project_progress'), render: (r) => },
- { key: 'activities_progress', label: t('tab_activities'), sortValue: (r) => (r.activities_total ? r.activities_complete / r.activities_total : 0), render: (r) => (
- {r.activities_complete}/{r.activities_total}
- ) },
- { key: 'comments_count', label: t('tab_comments'), render: (r) => },
- { key: 'documents_count', label: t('tab_documents'), render: (r) => },
{ key: 'shared', label: '', sortable: false, render: (r) => },
{ key: 'risk_level', label: t('project_risk'), render: (r) => {t(`risk_${r.risk_level}`)} },
{ key: 'updated_at', label: t('project_updated_at'), render: (r) => String(r.updated_at).slice(0, 16) },
diff --git a/frontend/src/styles/app.css b/frontend/src/styles/app.css
index b5e2118..96a7b96 100644
--- a/frontend/src/styles/app.css
+++ b/frontend/src/styles/app.css
@@ -229,8 +229,6 @@ table.list-table { width: 100%; border-collapse: collapse; font-size: .8rem; }
background: rgb(var(--danger) / .18); color: rgb(var(--danger));
font-size: .68rem; font-weight: 700; line-height: 1;
}
-.count-badge { display: inline-flex; align-items: center; gap: 4px; color: rgb(var(--muted)); font-size: .8rem; white-space: nowrap; }
-
/* --- Cards / KPIs --- */
.kpi-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 14px; margin-bottom: 20px; }
.kpi-card { background: rgb(var(--surface)); border: 1px solid rgb(var(--line)); border-radius: var(--r-lg); padding: 16px; }