Feature: Comentarios asociados a estudiantes, tanto confidenciales como no confidenciales
Qué cambia
Nueva tab "Comentarios" en la ficha del estudiante, con dos secciones independientes que consumen los endpoints ya existentes en el backend:
-
Comentarios —
/comentarios-normales-estudiante -
Observaciones confidenciales —
/comentarios-confidenciales-estudiante
Cada sección permite publicar, editar (inline) y eliminar (con confirmación), gateada por sus propios cuatro permisos, igual que los exige el backend:
VER / CREAR / EDITAR / ELIMINAR_COMENTARIO_{NORMAL,CONFIDENCIAL}_ESTUDIANTE.
Si al usuario le falta el permiso de ver, la sección muestra "No tenés permiso para ver esta información" en vez de ocultarse (mismo criterio que ya usa la tab de Salud confidencial).
Cómo está armado
-
src/lib/comments.ts: cliente de API para los 8 endpoints (list/create/update/delete × normal/confidencial), con un solo tipoStudentCommentporque ambos recursos comparten contrato. -
src/components/students/CommentsSection.tsx: un único componente parametrizado por los 4 permisos y las 4 funciones de API, reutilizado para las dos secciones — evita duplicar la UI (lista, form de alta, edición inline, diálogo de eliminar). -
src/lib/format.ts: se agregaformatFechaHorapara mostrar fecha y hora del comentario (createdAt venía sin usar en ningún lado del frontend hasta ahora).
Bug encontrado y corregido en el camino
El indicador "(editado)" aparecía en todo comentario recién creado, no solo en los editados. Causa: @CreationTimestamp/@UpdateTimestamp de Hibernate capturan el reloj en dos llamadas separadas al insertar, así que createdAt y updatedAt casi nunca coinciden exactamente ni al crear. Se cambió la comparación de igualdad exacta por un margen de 2 segundos.