Feats y Fixs Varios

This commit is contained in:
2025-08-30 11:31:45 -03:00
parent 3b8c6bf754
commit 608ae655be
22 changed files with 732 additions and 100 deletions

View File

@@ -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<Bancada | null>(null);
const queryClient = useQueryClient();
// Obtenemos todas las agrupaciones para poblar el <select>
const { data: agrupaciones = [] } = useQuery<AgrupacionPolitica[]>({
queryKey: ['agrupaciones'],
queryFn: getAgrupaciones
});
// Obtenemos las bancas para la cámara activa (diputados o senadores)
const { data: bancadas = [], isLoading, error } = useQuery<Bancada[]>({
queryKey: ['bancadas', activeTab],
queryFn: () => getBancadas(activeTab),
@@ -40,10 +38,9 @@ export const BancasManager = () => {
try {
await updateBancada(bancadaId, payload);
// Invalida la query para forzar una recarga de datos frescos desde el servidor
queryClient.invalidateQueries({ queryKey: ['bancadas', activeTab] });
} catch (err) {
alert("Error al guardar el cambio.");
alert("Error al guardar el cambio de agrupación.");
}
};
@@ -57,8 +54,8 @@ export const BancasManager = () => {
return (
<div className="admin-module">
<h2>Gestión de Ocupación de Bancas</h2>
<p>Asigne a cada banca un partido político y, opcionalmente, los datos de la persona que la ocupa.</p>
<p>Asigne a cada banca física un partido político y, opcionalmente, los datos de la persona que la ocupa.</p>
<div className="chamber-tabs">
{camaras.map(camara => (
<button
@@ -75,16 +72,25 @@ export const BancasManager = () => {
<table>
<thead>
<tr>
<th>Banca #</th>
<th>Partido Asignado</th>
<th>Ocupante Actual</th>
<th>Acciones</th>
<th style={{ width: '15%' }}>Banca #</th>
<th style={{ width: '35%' }}>Partido Asignado</th>
<th style={{ width: '30%' }}>Ocupante Actual</th>
<th style={{ width: '20%' }}>Acciones</th>
</tr>
</thead>
<tbody>
{bancadas.map((bancada, index) => (
{bancadas.map((bancada) => (
<tr key={bancada.id}>
<td>{`${activeTab.charAt(0).toUpperCase()}-${index + 1}`}</td>
{/* Usamos el NumeroBanca para la etiqueta visual */}
<td>
{`${activeTab.charAt(0).toUpperCase()}-${bancada.numeroBanca}`}
{((activeTab === 'diputados' && bancada.numeroBanca === 92) ||
(activeTab === 'senadores' && bancada.numeroBanca === 46)) && (
<span style={{ marginLeft: '8px', fontSize: '0.8em', color: '#666', fontStyle: 'italic' }}>
(Presidencia)
</span>
)}
</td>
<td>
<select
value={bancada.agrupacionPoliticaId || ''}
@@ -97,6 +103,7 @@ export const BancasManager = () => {
<td>{bancada.ocupante?.nombreOcupante || 'Sin asignar'}</td>
<td>
<button
// El botón se habilita solo si hay un partido asignado a la banca
disabled={!bancada.agrupacionPoliticaId}
onClick={() => handleOpenModal(bancada)}
>

View File

@@ -15,10 +15,8 @@ export const DashboardPage = () => {
<h1>Panel de Administración Electoral</h1>
<button onClick={logout}>Cerrar Sesión</button>
</header>
<main style={{ marginTop: '2rem' }}>
<ConfiguracionGeneral />
<main style={{ marginTop: '2rem' }}>
<AgrupacionesManager />
<div style={{ display: 'flex', gap: '2rem', flexWrap: 'wrap', marginTop: '2rem' }}>
<div style={{ flex: '1 1 400px' }}>
<OrdenDiputadosManager />
@@ -27,6 +25,7 @@ export const DashboardPage = () => {
<OrdenSenadoresManager />
</div>
</div>
<ConfiguracionGeneral />
<BancasManager />
</main>
</div>

View File

@@ -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;