refactor: version 2.18.2 -- Panel: se quita "Mis actividades pendientes"
El detalle vive en los popups de las tarjetas; se elimina tambien la consulta myPendingActivities del backend, que quedaba sin uso. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,10 @@
|
||||
# Changelog - project.linkedcorp.net
|
||||
|
||||
## [2.18.2] - 2026-10-21
|
||||
### Removed
|
||||
- Panel: se quita el bloque "Mis actividades pendientes" (el detalle ya se ve en el popup de
|
||||
cada tarjeta). Queda solo "Proyectos por estado" debajo de las tarjetas.
|
||||
|
||||
## [2.18.1] - 2026-10-21
|
||||
### Fixed
|
||||
- Panel → popups de detalle: las barras de avance quedan alineadas una debajo de otra aunque la
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "project-linkedcorp-backend",
|
||||
"version": "2.18.1",
|
||||
"version": "2.18.2",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"main": "src/server.js",
|
||||
|
||||
@@ -14,10 +14,9 @@ function memberFilterFor(currentUser) {
|
||||
|
||||
export const getSummary = asyncHandler(async (req, res) => {
|
||||
const memberUserId = memberFilterFor(req.currentUser);
|
||||
const [kpis, myActivities, byStatus, overdueProjects, activeProjects, dueSoonProjects,
|
||||
const [kpis, byStatus, overdueProjects, activeProjects, dueSoonProjects,
|
||||
pendingActivities, overdueActivities, todayActivities] = await Promise.all([
|
||||
repo.summary(memberUserId),
|
||||
repo.myPendingActivities(req.currentUser.id, memberUserId),
|
||||
repo.projectsByStatus(memberUserId),
|
||||
repo.overdueProjectsList(memberUserId),
|
||||
repo.activeProjectsList(memberUserId),
|
||||
@@ -30,7 +29,6 @@ export const getSummary = asyncHandler(async (req, res) => {
|
||||
const withActivityDue = (a) => ({ ...a, dueStatus: dueStatus(a.due_date) });
|
||||
ok(res, {
|
||||
kpis,
|
||||
myActivities: myActivities.map(withActivityDue),
|
||||
projectsByStatus: byStatus,
|
||||
// Detalle de cada tarjeta del Panel (popup al hacer clic).
|
||||
overdueProjects: overdueProjects.map((p) => ({ ...p, dueStatus: 'overdue' })),
|
||||
|
||||
@@ -152,19 +152,6 @@ export async function overdueProjectsList(memberUserId) {
|
||||
return rows;
|
||||
}
|
||||
|
||||
export async function myPendingActivities(userId, memberUserId) {
|
||||
const memberClause = memberUserId ? 'AND EXISTS (SELECT 1 FROM project_members pm WHERE pm.project_id = p.id AND pm.user_id = ?)' : '';
|
||||
const params = memberUserId ? [userId, memberUserId] : [userId];
|
||||
const [rows] = await pool.query(
|
||||
`SELECT a.id, a.code, a.name, a.due_date, a.progress_pct, p.id AS project_id, p.name AS project_name
|
||||
FROM activities a JOIN activity_statuses st ON st.id = a.status_id JOIN projects p ON p.id = a.project_id
|
||||
WHERE st.is_closed = 0 AND p.deleted_at IS NULL AND a.responsible_user_id = ? ${memberClause}
|
||||
ORDER BY (a.due_date IS NULL), a.due_date LIMIT 20`,
|
||||
params
|
||||
);
|
||||
return rows;
|
||||
}
|
||||
|
||||
export async function calendarActivities(monthStart, monthEnd, memberUserId) {
|
||||
const memberClause = memberUserId ? 'AND EXISTS (SELECT 1 FROM project_members pm WHERE pm.project_id = p.id AND pm.user_id = ?)' : '';
|
||||
const params = memberUserId ? [monthStart, monthEnd, memberUserId] : [monthStart, monthEnd];
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "project-linkedcorp-frontend",
|
||||
"private": true,
|
||||
"version": "2.18.1",
|
||||
"version": "2.18.2",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -154,7 +154,6 @@ export const messages = {
|
||||
dashboard_overdue_activities: 'Actividades vencidas',
|
||||
dashboard_today_activities: 'Para hoy',
|
||||
dashboard_average_progress: 'Avance promedio',
|
||||
dashboard_my_activities: 'Mis actividades pendientes',
|
||||
common_of: 'de',
|
||||
dashboard_projects_by_status: 'Proyectos por estado',
|
||||
|
||||
@@ -640,7 +639,6 @@ export const messages = {
|
||||
dashboard_overdue_activities: 'Overdue activities',
|
||||
dashboard_today_activities: 'Due today',
|
||||
dashboard_average_progress: 'Average progress',
|
||||
dashboard_my_activities: 'My pending activities',
|
||||
common_of: 'of',
|
||||
dashboard_projects_by_status: 'Projects by status',
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ export default function DashboardPage() {
|
||||
const [detail, setDetail] = useState(null);
|
||||
|
||||
if (!data) return <div className="text-muted">{t('common_loading')}</div>;
|
||||
const { kpis, myActivities, projectsByStatus } = data;
|
||||
const { kpis, projectsByStatus } = data;
|
||||
const activeTotal = Number(kpis.activeProjects) || 0;
|
||||
const nonCancelledTotal = Number(kpis.nonCancelledProjects) || 0;
|
||||
const activitiesTotal = Number(kpis.nonCancelledActivities) || 0;
|
||||
@@ -125,21 +125,6 @@ export default function DashboardPage() {
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="panel-card">
|
||||
<h3>{t('dashboard_my_activities')}</h3>
|
||||
{myActivities.length === 0 && <div className="text-muted">{t('common_empty')}</div>}
|
||||
{myActivities.map((a) => (
|
||||
<div key={a.id} onClick={() => navigate(`/proyectos/${a.project_id}`)} style={ROW_STYLE}>
|
||||
<div style={{ flex: 1 }}>
|
||||
<div style={{ fontSize: '.82rem', fontWeight: 600 }}>{a.name}</div>
|
||||
<div className="text-muted" style={{ fontSize: '.72rem' }}>{a.project_name} · {a.due_date || '—'}</div>
|
||||
</div>
|
||||
<div style={{ width: 120 }}><ProgressBar value={Number(a.progress_pct)} /></div>
|
||||
<DueBadge status={a.dueStatus} />
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className="panel-card">
|
||||
<h3>{t('dashboard_projects_by_status')}</h3>
|
||||
{projectsByStatus.map((s) => (
|
||||
|
||||
Reference in New Issue
Block a user