);
}
// Helper para generar numeros de pagina con ellipsis
function generatePageNumbers(current: number, total: number): (number | string)[] {
if (total <= 7) {
return Array.from({ length: total }, (_, i) => i + 1);
}
if (current <= 3) {
return [1, 2, 3, 4, '...', total];
}
if (current >= total - 2) {
return [1, '...', total - 3, total - 2, total - 1, total];
}
return [1, '...', current - 1, current, current + 1, '...', total];
}
```
---
### useStudentMonitoring.ts (Modificaciones)
```typescript
// Nuevos estados
const [page, setPage] = useState(1);
const [limit, setLimit] = useState(25);
const [pagination, setPagination] = useState(null);
// Modificar fetchStudents
const query: GetClassroomStudentsQueryDto = {
page,
limit,
...(filters?.status?.[0] && { status: filters.status[0] as 'active' | 'inactive' }),
};
const response = await classroomsApi.getClassroomStudents(classroomId, query);
setStudents(response.data || []);
setPagination(response.pagination);
// Funcion para cambiar limite (resetea a pagina 1)
const setPageLimit = useCallback((newLimit: number) => {
setLimit(newLimit);
setPage(1); // Resetear a primera pagina
}, []);
// Actualizar return
return {
students,
loading,
error,
page,
limit,
pagination,
setPage,
setPageLimit,
refreshInterval,
setRefreshInterval,
refresh,
lastUpdate,
};
```
---
### StudentMonitoringPanel.tsx (Modificaciones)
```typescript
// Imports adicionales
import { StudentPagination } from './StudentPagination';
// Obtener datos del hook
const {
students,
loading,
error,
page,
limit,
pagination,
setPage,
setPageLimit,
refreshInterval,
setRefreshInterval,
refresh,
lastUpdate,
} = useStudentMonitoring(classroomId, filters);
// En stats overview, usar pagination.total en lugar de students.length
{pagination?.total ?? students.length}
// Agregar StudentPagination al final
{pagination && (
)}
```
---
## VALIDACIONES POST-IMPLEMENTACION
1. [ ] Con 10 estudiantes, paginacion muestra "1 de 1" paginas
2. [ ] Con 44 estudiantes y limit=25, muestra "1-25 de 44" y 2 paginas
3. [ ] Cambiar a pagina 2 muestra estudiantes 26-44
4. [ ] Cambiar limite de 25 a 10 resetea a pagina 1
5. [ ] Aplicar filtro de status resetea a pagina 1
6. [ ] Stats overview muestra total real (44) no solo pagina actual (25)
7. [ ] Boton "anterior" deshabilitado en pagina 1
8. [ ] Boton "siguiente" deshabilitado en ultima pagina
9. [ ] Loading spinner al cambiar de pagina
---
## RIESGOS
| Riesgo | Impacto | Mitigacion |
|--------|---------|------------|
| Stats calculados client-side incorrectos | Medio | Obtener stats del backend separadamente |
| Filtrado performance client-side | Bajo | Mover todo filtrado a server-side |
| Orden no consistente entre paginas | Medio | Siempre pasar sort_by y sort_order |
---
## ARCHIVOS A MODIFICAR
| Orden | Archivo | Accion |
|-------|---------|--------|
| 1 | monitoring/StudentPagination.tsx | CREAR |
| 2 | hooks/useStudentMonitoring.ts | MODIFICAR |
| 3 | monitoring/StudentMonitoringPanel.tsx | MODIFICAR |
| 4 | monitoring/index.ts (si existe) | EXPORTAR |
---
**Siguiente Fase:** Validacion del plan contra el analisis y dependencias.