# Componentes de Gestion de Respuestas - Teacher Portal **Version:** 1.0.0 **Fecha:** 2025-12-18 **Modulo:** Teacher Portal - Sistema de Respuestas de Ejercicios --- ## ESTRUCTURA ``` apps/frontend/src/apps/teacher/components/responses/ ├── ResponseDetailModal.tsx # Modal detalle de intento ├── ResponsesTable.tsx # Tabla de intentos └── ResponseFilters.tsx # Filtros avanzados ``` --- ## 1. ResponseDetailModal **Ubicacion:** `components/responses/ResponseDetailModal.tsx` ### Proposito Modal completo para visualizar y analizar intentos de ejercicios con comparacion de respuestas. ### Props ```typescript interface ResponseDetailModalProps { attemptId: string | null; open: boolean; onClose: () => void; } ``` ### Secciones #### 1. Header - Titulo "Detalle de Respuesta" - Boton cerrar #### 2. Info Cards (2 columnas) | Card | Contenido | |------|-----------| | Estudiante | Avatar, nombre, numero de intento | | Ejercicio | Titulo, modulo, tipo | #### 3. Result Badge - Icono check/X con animacion - Texto "Correcto" / "Incorrecto" - Color verde/rojo #### 4. Metrics Grid (4 badges) | Metrica | Formato | |---------|---------| | Score | puntaje/maximo | | Tiempo | MM:SS | | Pistas usadas | # | | Comodines usados | # | #### 5. Rewards Section - XP Ganado (con icono estrella) - ML Coins ganadas (con icono moneda) #### 6. Answer Comparison - Columna izquierda: Respuesta del estudiante - Columna derecha: Respuesta correcta - Usa ExerciseContentRenderer segun tipo #### 7. Metadata - Fecha/hora de envio - Lista de comodines utilizados #### 8. Footer Actions - Boton "Calificar" (si requiere revision manual) - Boton "Cerrar" ### Ejercicios con Revision Manual ```typescript const MANUAL_REVIEW_EXERCISES = { module3: ['podcast_argumentativo'], module4: [ 'verificador_fake_news', 'quiz_tiktok', 'analisis_memes', 'infografia_interactiva', 'navegacion_hipertextual' ], module5: [ 'diario_multimedia', 'comic_digital', 'video_carta' ] }; ``` --- ## 2. ResponsesTable **Ubicacion:** `components/responses/ResponsesTable.tsx` ### Proposito Tabla interactiva de intentos de ejercicios con sorting y paginacion server-side. ### Props ```typescript interface ResponsesTableProps { data: AttemptResponse[]; total: number; page: number; limit: number; loading?: boolean; onViewDetail: (attemptId: string) => void; onPageChange: (newPage: number) => void; onSortChange?: ( sortBy: 'submitted_at' | 'score' | 'time', sortOrder: 'asc' | 'desc' ) => void; } ``` ### Columnas | Columna | Sorteable | Contenido | |---------|-----------|-----------| | Estudiante | No | Avatar + nombre | | Ejercicio | No | Titulo | | Modulo | No | Nombre modulo | | Intento | No | Badge #N | | Score | Si | % con color semantico | | Correcto | No | Icono check/X | | Tiempo | Si | MM:SS con icono | | Fecha | Si | Fecha formateada | | Acciones | No | Boton "Ver" | ### Colores de Score | Rango | Color | |-------|-------| | >= 80% | Verde | | >= 60% | Azul | | >= 40% | Naranja | | < 40% | Rojo | ### Estados | Estado | Render | |--------|--------| | loading + sin datos | Skeleton rows animados | | sin datos | Mensaje con icono "Sin respuestas" | | con datos | Filas con hover y animacion | ### Paginacion - Info: "Mostrando 1-20 de 150" - Botones: anterior/siguiente - Numeros: 1-5 pages visibles - Salto a primera/ultima pagina --- ## 3. ResponseFilters **Ubicacion:** `components/responses/ResponseFilters.tsx` ### Proposito Panel de filtros expandible para busqueda avanzada de respuestas de ejercicios. ### Props ```typescript interface ResponseFiltersProps { filters: GetAttemptsQuery; onChange: (filters: GetAttemptsQuery) => void; onClear: () => void; } ``` ### Filtros Disponibles | Filtro | Tipo | Descripcion | |--------|------|-------------| | Aula | dropdown | "Todas las aulas" o aula especifica | | Estudiante | text | Busqueda por nombre (debounce 300ms) | | Fecha Desde | date | ISO date format | | Fecha Hasta | date | ISO date format | | Estado | radio | Todos, Correctas, Incorrectas | ### Funcionalidades - Header expandible/colapsable con animacion - Badge contador de filtros activos - Boton "Limpiar Filtros" (deshabilitado si no hay activos) - Debounce en busqueda de estudiante - Iconos semanticos para estado (check verde, X rojo) ### Ejemplo de Uso ```typescript ``` --- ## TIPOS PRINCIPALES ### AttemptResponse ```typescript interface AttemptResponse { id: string; attemptNumber: number; // Estudiante studentId: string; studentName: string; studentEmail?: string; studentAvatarUrl?: string; // Ejercicio exerciseId: string; exerciseTitle: string; exerciseType: string; moduleId: string; moduleName: string; // Resultado isCorrect: boolean; score: number; maxScore: number; timeSpentSeconds: number; // Respuestas studentAnswer: any; correctAnswer: any; // Gamificacion xpEarned: number; coinsEarned: number; hintsUsed: number; powerUpsUsed: string[]; // Metadata submittedAt: string; reviewedAt?: string; reviewedBy?: string; needsManualReview: boolean; } ``` ### GetAttemptsQuery ```typescript interface GetAttemptsQuery { classroomId?: string; studentName?: string; dateFrom?: string; dateTo?: string; isCorrect?: boolean; page?: number; limit?: number; sortBy?: 'submitted_at' | 'score' | 'time'; sortOrder?: 'asc' | 'desc'; } ``` --- ## DIAGRAMA DE FLUJO ``` ┌─────────────────────────────────────────────────────────┐ │ TeacherExerciseResponsesPage │ ├─────────────────────────────────────────────────────────┤ │ ┌─────────────────────────────────────────────────┐ │ │ │ ResponseFilters │ │ │ │ [Aula v] [Buscar...] [Desde] [Hasta] [Estado] │ │ │ │ Filtros activos: 2 [Limpiar] │ │ │ └─────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ ResponsesTable │ │ │ │ ┌────────────────────────────────────────────┐ │ │ │ │ │ Estudiante | Ejercicio | Score | Fecha │ │ │ │ │ ├────────────────────────────────────────────┤ │ │ │ │ │ Juan Perez | Ejercicio 1| 85% | 15 dic │ │ │ │ │ │ Maria ... | Ejercicio 2| 92% | 15 dic │ │ │ │ │ └────────────────────────────────────────────┘ │ │ │ │ [< Prev] 1 2 3 4 5 [Next >] │ │ │ └─────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────┐ │ │ │ ResponseDetailModal (overlay) │ │ │ │ ┌──────────────────────────────────┐ │ │ │ │ │ Info Cards | Result | Metrics │ │ │ │ │ │ Answer Comparison │ │ │ │ │ │ [Estudiante] vs [Correcta] │ │ │ │ │ │ │ │ │ │ │ │ [Calificar] [Cerrar] │ │ │ │ │ └──────────────────────────────────┘ │ │ │ └──────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────┘ ``` --- ## HOOKS RELACIONADOS | Hook | Proposito | |------|-----------| | useExerciseResponses | Fetch de intentos con filtros | | useAttemptDetail | Detalle de un intento | | useClassrooms | Lista de aulas para filtro | --- ## PAGINAS QUE USAN ESTOS COMPONENTES | Pagina | Componentes Usados | |--------|-------------------| | TeacherExerciseResponsesPage | Todos los componentes | --- ## REFERENCIAS - `useExerciseResponses.ts` - Hook de datos - `exerciseResponsesApi.ts` - Cliente API - `TeacherExerciseResponsesPage.tsx` - Pagina principal --- **Ultima actualizacion:** 2025-12-18