# US-ADM-003: Dashboard de Maestro
**Épica:** EAI-005 (Plataforma de Maestro Básica)
**Sprint:** Mes 1, Semana 2
**Story Points:** 8 SP
**Presupuesto:** $3,200 MXN
**Prioridad:** Alta (Alcance Inicial)
**Estado:** ✅ Completada (Mes 1)
---
## Descripción
Como profesor, quiero tener un dashboard general que me muestre un resumen de todas mis aulas para tener una vista panorámica de mi trabajo y acceder rápidamente a cada aula.
**Contexto del Alcance Inicial:**
Este es el dashboard principal del profesor al iniciar sesión. Muestra un resumen de todas sus aulas con estadísticas básicas y acceso rápido a analytics. NO incluye gráficas avanzadas, comparativas entre aulas, ni métricas de engagement (eso va a EXT-001 Portal de Maestros Completo).
---
## Criterios de Aceptación
### CA-01: Vista General de Aulas
- [ ] Grid/cards con todas las aulas del profesor
- [ ] Para cada aula muestra:
- Nombre y nivel/grado
- # total de estudiantes
- Progreso promedio (%)
- # de módulos asignados
- Acceso rápido a dashboard del aula (US-ANA-001)
- Acceso a lista de estudiantes (US-ADM-002)
### CA-02: Resumen Global
- [ ] Cards con métricas totales:
- Total de aulas
- Total de estudiantes (suma de todas las aulas)
- Promedio general de progreso
- [ ] Destacar aula con mejor/peor progreso
### CA-03: Actividad Reciente Global
- [ ] Feed de las últimas 10 actividades de TODAS las aulas
- [ ] Cada actividad muestra: estudiante, aula, actividad, timestamp
- [ ] Link rápido a perfil del estudiante
### CA-04: Acciones Rápidas
- [ ] Botón "Crear Nueva Aula" (US-ADM-001)
- [ ] Selector de aula en header (dropdown para cambiar de contexto)
### CA-05: Navegación
- [ ] Breadcrumb: Dashboard
- [ ] Sidebar con:
- Dashboard (esta vista)
- Mis Aulas (lista completa)
- Configuración (placeholder)
---
## Especificaciones Técnicas
### Backend
**Endpoint Principal:**
```
GET /api/teacher/dashboard
```
**Response:**
```json
{
"summary": {
"totalClassrooms": 3,
"totalStudents": 75,
"averageProgress": 62.5
},
"classrooms": [
{
"id": "uuid",
"name": "Matemáticas 6A",
"level": "primaria",
"grade": 6,
"studentCount": 25,
"averageProgress": 65.5,
"moduleCount": 5,
"lastActivity": "2025-11-02T10:00:00Z"
}
],
"recentActivities": [
{
"id": "activity-uuid",
"studentName": "Juan Pérez",
"classroomName": "Matemáticas 6A",
"activityName": "Suma de fracciones",
"timestamp": "2025-11-02T10:30:00Z"
}
],
"insights": {
"bestPerformingClassroom": {
"id": "uuid",
"name": "Matemáticas 6A",
"progress": 75.5
},
"needsAttentionClassroom": {
"id": "uuid",
"name": "Ciencias 5B",
"progress": 45.2
}
}
}
```
**Controller:**
```typescript
@Get('teacher/dashboard')
async getTeacherDashboard(@CurrentUser() teacher: User) {
return this.teacherService.getDashboard(teacher.id);
}
```
**Service:**
```typescript
async getDashboard(teacherId: string) {
const classrooms = await this.getClassroomsSummary(teacherId);
const recentActivities = await this.getRecentActivitiesAcrossClassrooms(teacherId, 10);
const summary = {
totalClassrooms: classrooms.length,
totalStudents: classrooms.reduce((sum, c) => sum + c.studentCount, 0),
averageProgress: classrooms.length > 0
? classrooms.reduce((sum, c) => sum + c.averageProgress, 0) / classrooms.length
: 0
};
const sortedByProgress = [...classrooms].sort((a, b) => b.averageProgress - a.averageProgress);
return {
summary,
classrooms,
recentActivities,
insights: {
bestPerformingClassroom: sortedByProgress[0] || null,
needsAttentionClassroom: sortedByProgress[sortedByProgress.length - 1] || null
}
};
}
```
### Frontend
**Ruta:**
```
/teacher/dashboard
```
**Componente Principal:**
```typescript
// TeacherDashboard.tsx
export const TeacherDashboard = () => {
const { dashboardData, isLoading } = useTeacherDashboard();
const navigate = useNavigate();
if (isLoading) return