From 608ae655bedf6c59be5fec1e14fc308871d2fd62 Mon Sep 17 00:00:00 2001 From: dmolinari Date: Sat, 30 Aug 2025 11:31:45 -0300 Subject: [PATCH] Feats y Fixs Varios --- .../src/components/BancasManager.tsx | 33 +- .../src/components/DashboardPage.tsx | 5 +- .../frontend-admin/src/types/index.ts | 1 + .../frontend/public/default-avatar.png | Bin 0 -> 14417 bytes Elecciones-Web/frontend/src/apiService.ts | 1 + .../src/components/CongresoWidget.css | 5 + .../src/components/CongresoWidget.tsx | 58 +- .../src/components/ParliamentLayout.tsx | 20 +- .../frontend/src/components/SenateLayout.tsx | 19 +- .../frontend/src/components/imageFallback.ts | 13 + .../Controllers/ResultadosController.cs | 94 ++-- Elecciones-Web/src/Elecciones.Api/Program.cs | 20 +- .../net9.0/Elecciones.Api.AssemblyInfo.cs | 2 +- .../Debug/net9.0/rjsmcshtml.dswa.cache.json | 2 +- .../Debug/net9.0/rjsmrazor.dswa.cache.json | 2 +- .../net9.0/Elecciones.Core.AssemblyInfo.cs | 2 +- .../Elecciones.Database/Entities/Bancada.cs | 3 + ...24636_AddNumeroBancaToBancadas.Designer.cs | 516 ++++++++++++++++++ ...20250830124636_AddNumeroBancaToBancadas.cs | 29 + .../EleccionesDbContextModelSnapshot.cs | 3 + .../Elecciones.Database.AssemblyInfo.cs | 2 +- .../Elecciones.Infrastructure.AssemblyInfo.cs | 2 +- 22 files changed, 732 insertions(+), 100 deletions(-) create mode 100644 Elecciones-Web/frontend/public/default-avatar.png create mode 100644 Elecciones-Web/frontend/src/components/imageFallback.ts create mode 100644 Elecciones-Web/src/Elecciones.Database/Migrations/20250830124636_AddNumeroBancaToBancadas.Designer.cs create mode 100644 Elecciones-Web/src/Elecciones.Database/Migrations/20250830124636_AddNumeroBancaToBancadas.cs diff --git a/Elecciones-Web/frontend-admin/src/components/BancasManager.tsx b/Elecciones-Web/frontend-admin/src/components/BancasManager.tsx index 9c2db97..86a85c4 100644 --- a/Elecciones-Web/frontend-admin/src/components/BancasManager.tsx +++ b/Elecciones-Web/frontend-admin/src/components/BancasManager.tsx @@ -4,7 +4,7 @@ import { useQuery, useQueryClient } from '@tanstack/react-query'; import { getBancadas, getAgrupaciones, updateBancada, type UpdateBancadaData } from '../services/apiService'; import type { Bancada, AgrupacionPolitica } from '../types'; import { OcupantesModal } from './OcupantesModal'; -import './AgrupacionesManager.css'; // Asegúrate de que este CSS tenga los estilos de .chamber-tabs +import './AgrupacionesManager.css'; const camaras = ['diputados', 'senadores'] as const; @@ -14,13 +14,11 @@ export const BancasManager = () => { const [bancadaSeleccionada, setBancadaSeleccionada] = useState(null); const queryClient = useQueryClient(); - // Obtenemos todas las agrupaciones para poblar el { {bancada.ocupante?.nombreOcupante || 'Sin asignar'} -
- +
-
@@ -27,6 +25,7 @@ export const DashboardPage = () => {
+
diff --git a/Elecciones-Web/frontend-admin/src/types/index.ts b/Elecciones-Web/frontend-admin/src/types/index.ts index 0107a48..a875434 100644 --- a/Elecciones-Web/frontend-admin/src/types/index.ts +++ b/Elecciones-Web/frontend-admin/src/types/index.ts @@ -36,6 +36,7 @@ export interface OcupanteBanca { export interface Bancada { id: number; camara: TipoCamaraValue; + numeroBanca: number; agrupacionPoliticaId: string | null; agrupacionPolitica: AgrupacionPolitica | null; ocupante: OcupanteBanca | null; diff --git a/Elecciones-Web/frontend/public/default-avatar.png b/Elecciones-Web/frontend/public/default-avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..c9da383d07b11ddd9e6f0195a77fcf4d38020805 GIT binary patch literal 14417 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 C@6Znb literal 0 HcmV?d00001 diff --git a/Elecciones-Web/frontend/src/apiService.ts b/Elecciones-Web/frontend/src/apiService.ts index a393203..22241b0 100644 --- a/Elecciones-Web/frontend/src/apiService.ts +++ b/Elecciones-Web/frontend/src/apiService.ts @@ -42,6 +42,7 @@ interface PartidoData { export interface BancadaDetalle { id: number; // Este es el ID de la Bancada camara: number; // 0 o 1 + numeroBanca: number; agrupacionPoliticaId: string | null; ocupante: OcupanteBanca | null; } diff --git a/Elecciones-Web/frontend/src/components/CongresoWidget.css b/Elecciones-Web/frontend/src/components/CongresoWidget.css index 96f1c4d..38e49ac 100644 --- a/Elecciones-Web/frontend/src/components/CongresoWidget.css +++ b/Elecciones-Web/frontend/src/components/CongresoWidget.css @@ -201,4 +201,9 @@ font-size: 12px; font-weight: bold; color: #333; +} + +#seat-tooltip.react-tooltip { + opacity: 1 !important; + background-color: white; /* Opcional: asegura un fondo sólido */ } \ No newline at end of file diff --git a/Elecciones-Web/frontend/src/components/CongresoWidget.tsx b/Elecciones-Web/frontend/src/components/CongresoWidget.tsx index 44cdb29..7b39bc7 100644 --- a/Elecciones-Web/frontend/src/components/CongresoWidget.tsx +++ b/Elecciones-Web/frontend/src/components/CongresoWidget.tsx @@ -29,44 +29,44 @@ export const CongresoWidget = () => { const datosCamaraActual = composicionData ? composicionData[camaraActiva] : null; + const esModoOficial = bancadasDetalle.length > 0; + // --- LÓGICA DE SEATFILLDATA --- const seatFillData = useMemo(() => { if (!datosCamaraActual) return []; - // --- LÓGICA DEL INTERRUPTOR --- - // Verificamos si la respuesta de la API contiene datos de ocupantes. - // Si bancadasDetalle tiene elementos, significa que el modo "Oficial" está activo en el backend. - const modoOficialActivo = bancadasDetalle.length > 0; - - if (modoOficialActivo) { - // --- MODO OFICIAL: Construir desde las bancas físicas --- + if (esModoOficial) { + // --- MODO OFICIAL --- const camaraId = camaraActiva === 'diputados' ? 0 : 1; const bancadasDeCamara = bancadasDetalle.filter(b => b.camara === camaraId); - const colorMap = new Map(); - datosCamaraActual.partidos.forEach(p => { - if (p.id && p.color) { - colorMap.set(p.id, p.color); + datosCamaraActual.partidos.forEach(p => { if (p.id && p.color) colorMap.set(p.id, p.color); }); + + // 1. Creamos un array del tamaño correcto, lleno de 'null's + const size = camaraActiva === 'diputados' ? 92 : 46; + const finalSeatData = new Array(size).fill(null); + + // 2. Poblamos el array usando NumeroBanca como índice + bancadasDeCamara.forEach(bancada => { + // El índice del SVG es NumeroBanca - 1 + const index = bancada.numeroBanca - 1; + if (index >= 0 && index < size) { + finalSeatData[index] = { + color: bancada.agrupacionPoliticaId ? colorMap.get(bancada.agrupacionPoliticaId) || DEFAULT_COLOR : DEFAULT_COLOR, + ocupante: bancada.ocupante + }; } }); - const bancadasOrdenadas = bancadasDeCamara.sort((a, b) => a.id - b.id); - - return bancadasOrdenadas.map(bancada => ({ - color: bancada.agrupacionPoliticaId ? colorMap.get(bancada.agrupacionPoliticaId) || DEFAULT_COLOR : DEFAULT_COLOR, - ocupante: bancada.ocupante - })); + return finalSeatData; } else { - // --- MODO PROYECCIÓN: Construir desde los totales de los partidos --- - // Esta es la lógica original que teníamos para el modo proyección. + // --- MODO PROYECCIÓN --- return datosCamaraActual.partidos.flatMap(party => { const seatColor = party.color || DEFAULT_COLOR; - // En modo proyección, no hay ocupantes individuales. return Array(party.bancasTotales).fill({ color: seatColor, ocupante: null }); }); } - }, [datosCamaraActual, bancadasDetalle, camaraActiva]); if (isLoadingComposicion) return
Cargando...
; @@ -78,11 +78,23 @@ export const CongresoWidget = () => {
{camaraActiva === 'diputados' ? ( - + ) : ( - + )}
+