From 12c6f18034d31741808fbd64448bfebf8210b028 Mon Sep 17 00:00:00 2001 From: Arturo Gomez Date: Wed, 10 Jun 2026 15:08:02 -0600 Subject: [PATCH] refactor(frontend): eliminar filtro global de developer del dashboard --- .../components/dashboard/EfficiencyChart.jsx | 9 ++-- .../dashboard/HoursByDeveloperChart.jsx | 9 ++-- .../components/dashboard/HoursPerMember.jsx | 5 +- .../src/components/dashboard/KpiDevStats.jsx | 6 +-- .../dashboard/TasksByDeveloperChart.jsx | 9 ++-- .../components/dashboard/WorkloadTable.jsx | 11 ++-- .../main/frontend/src/pages/DashboardPage.jsx | 54 +++++-------------- 7 files changed, 35 insertions(+), 68 deletions(-) diff --git a/MtdrSpring/backend/src/main/frontend/src/components/dashboard/EfficiencyChart.jsx b/MtdrSpring/backend/src/main/frontend/src/components/dashboard/EfficiencyChart.jsx index 2ae103276..f64423c73 100644 --- a/MtdrSpring/backend/src/main/frontend/src/components/dashboard/EfficiencyChart.jsx +++ b/MtdrSpring/backend/src/main/frontend/src/components/dashboard/EfficiencyChart.jsx @@ -36,7 +36,7 @@ const CustomLegend = ({ payload }) => ( ); -export default function EfficiencyChart({ sprintId, devId }) { +export default function EfficiencyChart({ sprintId }) { const { project } = useProject(); const [data, setData] = useState(null); const [loading, setLoading] = useState(true); @@ -54,11 +54,10 @@ export default function EfficiencyChart({ sprintId, devId }) { if (loading) return ; if (error) return

{error}

; if (!data) return

Select a sprint to view data.

; - const visibleMembers = (data.members || []).filter((m) => !devId || m.userId === devId); - if (!visibleMembers.length) return

No completed tasks in this sprint.

; + if (!data.members?.length) return

No completed tasks in this sprint.

; const handleExport = () => { - const rows = visibleMembers.map((m) => ({ + const rows = data.members.map((m) => ({ Miembro: m.fullName, 'SP Completados': m.spCompleted, 'Horas Reales': parseFloat(m.actualHours.toFixed(1)), @@ -66,7 +65,7 @@ export default function EfficiencyChart({ sprintId, devId }) { exportCsv(rows, `efficiency-sprint-${sprintId}`); }; - const chartData = visibleMembers.map((m) => ({ + const chartData = data.members.map((m) => ({ name: m.fullName.split(' ')[0], 'SP done': m.spCompleted, 'Hours': parseFloat(m.actualHours.toFixed(1)), diff --git a/MtdrSpring/backend/src/main/frontend/src/components/dashboard/HoursByDeveloperChart.jsx b/MtdrSpring/backend/src/main/frontend/src/components/dashboard/HoursByDeveloperChart.jsx index 8ac70a616..a77701585 100644 --- a/MtdrSpring/backend/src/main/frontend/src/components/dashboard/HoursByDeveloperChart.jsx +++ b/MtdrSpring/backend/src/main/frontend/src/components/dashboard/HoursByDeveloperChart.jsx @@ -41,7 +41,7 @@ const CustomLegend = ({ payload }) => ( ); -export default function HoursByDeveloperChart({ sprints, selectedSprintId, devId }) { +export default function HoursByDeveloperChart({ sprints, selectedSprintId }) { const { project } = useProject(); const [chartData, setChartData] = useState([]); const [members, setMembers] = useState([]); @@ -78,11 +78,10 @@ export default function HoursByDeveloperChart({ sprints, selectedSprintId, devId }); }); - let candidateIds = Object.entries(totals) + const top8ids = Object.entries(totals) .sort((a, b) => b[1] - a[1]) + .slice(0, 8) .map(([id]) => Number(id)); - if (devId) candidateIds = candidateIds.filter((id) => id === devId); - const top8ids = candidateIds.slice(0, 8); const data = selected.map((s, i) => { const row = { sprint: s.sprintName }; @@ -99,7 +98,7 @@ export default function HoursByDeveloperChart({ sprints, selectedSprintId, devId }) .catch((err) => setError(err.message)) .finally(() => setLoading(false)); - }, [project.id, sprints, selectedSprintId, devId]); + }, [project.id, sprints, selectedSprintId]); if (loading) return ; if (error) return

{error}

; diff --git a/MtdrSpring/backend/src/main/frontend/src/components/dashboard/HoursPerMember.jsx b/MtdrSpring/backend/src/main/frontend/src/components/dashboard/HoursPerMember.jsx index d24ad7cf1..bfd131bca 100644 --- a/MtdrSpring/backend/src/main/frontend/src/components/dashboard/HoursPerMember.jsx +++ b/MtdrSpring/backend/src/main/frontend/src/components/dashboard/HoursPerMember.jsx @@ -10,7 +10,7 @@ function initials(name) { return name?.split(' ').map((n) => n[0]).slice(0, 2).join('') ?? '?'; } -export default function HoursPerMember({ sprintId, devId }) { +export default function HoursPerMember({ sprintId }) { const { project } = useProject(); const [data, setData] = useState(null); const [loading, setLoading] = useState(true); @@ -30,8 +30,7 @@ export default function HoursPerMember({ sprintId, devId }) { if (!data) return

Select a sprint to view data.

; if (!data.members?.length) return

No hours logged yet.

; - const filtered = devId ? data.members.filter((m) => m.userId === devId) : data.members; - const sorted = [...filtered].sort((a, b) => b.actualHours - a.actualHours); + const sorted = [...data.members].sort((a, b) => b.actualHours - a.actualHours); const max = sorted[0]?.actualHours || 1; return ( diff --git a/MtdrSpring/backend/src/main/frontend/src/components/dashboard/KpiDevStats.jsx b/MtdrSpring/backend/src/main/frontend/src/components/dashboard/KpiDevStats.jsx index d793034c9..a2cd97fa3 100644 --- a/MtdrSpring/backend/src/main/frontend/src/components/dashboard/KpiDevStats.jsx +++ b/MtdrSpring/backend/src/main/frontend/src/components/dashboard/KpiDevStats.jsx @@ -23,7 +23,7 @@ function MiniKpi({ label, value, sub }) { ); } -export default function KpiDevStats({ sprintId, devId }) { +export default function KpiDevStats({ sprintId }) { const { project } = useProject(); const [effData, setEffData] = useState(null); const [wkData, setWkData] = useState(null); @@ -51,8 +51,8 @@ export default function KpiDevStats({ sprintId, devId }) { } if (error) return

{error}

; - const effMembers = (effData?.members || []).filter((m) => !devId || m.userId === devId); - const wkMembers = (wkData || []).filter((m) => !devId || m.userId === devId); + const effMembers = effData?.members || []; + const wkMembers = wkData || []; const hoursArr = effMembers.map((m) => m.actualHours || 0); const tasksArr = wkMembers.map((m) => m.taskCounts?.DONE || 0); diff --git a/MtdrSpring/backend/src/main/frontend/src/components/dashboard/TasksByDeveloperChart.jsx b/MtdrSpring/backend/src/main/frontend/src/components/dashboard/TasksByDeveloperChart.jsx index b3ba8b79e..18cc204ba 100644 --- a/MtdrSpring/backend/src/main/frontend/src/components/dashboard/TasksByDeveloperChart.jsx +++ b/MtdrSpring/backend/src/main/frontend/src/components/dashboard/TasksByDeveloperChart.jsx @@ -41,7 +41,7 @@ const CustomLegend = ({ payload }) => ( ); -export default function TasksByDeveloperChart({ sprints, selectedSprintId, devId }) { +export default function TasksByDeveloperChart({ sprints, selectedSprintId }) { const { project } = useProject(); const [chartData, setChartData] = useState([]); const [members, setMembers] = useState([]); @@ -78,11 +78,10 @@ export default function TasksByDeveloperChart({ sprints, selectedSprintId, devId }); }); - let candidateIds = Object.entries(totals) + const top8ids = Object.entries(totals) .sort((a, b) => b[1] - a[1]) + .slice(0, 8) .map(([id]) => Number(id)); - if (devId) candidateIds = candidateIds.filter((id) => id === devId); - const top8ids = candidateIds.slice(0, 8); const data = selected.map((s, i) => { const row = { sprint: s.sprintName }; @@ -99,7 +98,7 @@ export default function TasksByDeveloperChart({ sprints, selectedSprintId, devId }) .catch((err) => setError(err.message)) .finally(() => setLoading(false)); - }, [project.id, sprints, selectedSprintId, devId]); + }, [project.id, sprints, selectedSprintId]); if (loading) return ; if (error) return

{error}

; diff --git a/MtdrSpring/backend/src/main/frontend/src/components/dashboard/WorkloadTable.jsx b/MtdrSpring/backend/src/main/frontend/src/components/dashboard/WorkloadTable.jsx index 4992f9211..1957de9ba 100644 --- a/MtdrSpring/backend/src/main/frontend/src/components/dashboard/WorkloadTable.jsx +++ b/MtdrSpring/backend/src/main/frontend/src/components/dashboard/WorkloadTable.jsx @@ -8,7 +8,7 @@ const STATUSES = ['TODO', 'IN_PROGRESS', 'BLOCKED', 'DONE']; function Skeleton() { return
; } -export default function WorkloadTable({ sprintId, devId }) { +export default function WorkloadTable({ sprintId }) { const { project } = useProject(); const [data, setData] = useState([]); const [loading, setLoading] = useState(true); @@ -26,8 +26,7 @@ export default function WorkloadTable({ sprintId, devId }) { if (loading) return ; if (error) return

{error}

; - const visibleData = data.filter((m) => !devId || m.userId === devId); - if (!visibleData.length) return

Select a sprint to view data.

; + if (!data.length) return

Select a sprint to view data.

; const getValue = (member, status) => mode === 'tasks' @@ -38,7 +37,7 @@ export default function WorkloadTable({ sprintId, devId }) { STATUSES.reduce((sum, s) => sum + getValue(member, s), 0); const handleExport = () => { - const rows = visibleData.map((m) => ({ + const rows = data.map((m) => ({ Miembro: m.fullName, 'Tasks TODO': m.taskCounts?.TODO ?? 0, 'Tasks IN_PROGRESS': m.taskCounts?.IN_PROGRESS ?? 0, @@ -87,8 +86,8 @@ export default function WorkloadTable({ sprintId, devId }) { - {visibleData.map((member, i) => ( - + {data.map((member, i) => ( + {member.fullName} {STATUSES.map((s) => ( { sprintService.list(project.id).then((data) => { @@ -58,23 +55,6 @@ export default function DashboardPage() { }).catch(() => {}); }, [project.id]); - // Load developer list from workload (all sprints) - useEffect(() => { - dashboardService.workload(project.id, null) - .then((members) => { - const unique = []; - const seen = new Set(); - (members || []).forEach((m) => { - if (!seen.has(m.userId)) { - seen.add(m.userId); - unique.push({ id: m.userId, name: m.fullName }); - } - }); - setDevelopers(unique.sort((a, b) => a.name.localeCompare(b.name))); - }) - .catch(() => {}); - }, [project.id]); - const sid = selectedSprintId || null; return ( @@ -87,20 +67,12 @@ export default function DashboardPage() {

{project.projectName}

-
- setSelectedSprintId(v ? Number(v) : null)} - options={sprints.map((s) => ({ value: String(s.id), label: sprintLabel(s) }))} - placeholder="All Sprints" - /> - setSelectedDevId(v ? Number(v) : null)} - options={developers.map((d) => ({ value: String(d.id), label: d.name }))} - placeholder="All Devs" - /> -
+ setSelectedSprintId(v ? Number(v) : null)} + options={sprints.map((s) => ({ value: String(s.id), label: sprintLabel(s) }))} + placeholder="All Sprints" + />
@@ -123,7 +95,7 @@ export default function DashboardPage() { {/* KPI row — new: Avg/Median por dev */} - + {/* Charts row */} @@ -131,15 +103,15 @@ export default function DashboardPage() { - + {/* Tables row */} - + - + {/* Backlog */} @@ -147,12 +119,12 @@ export default function DashboardPage() { - {/* Developer charts — filtered by sprint/dev */} + {/* Developer charts — filtered by sprint */} - + - + {/* Compare panel */}