/admin/responses: filtro survey dinámico (select, no hardcodeado), paginación 50/página, link a vista detallada, conteos consistentes con el filtro de preguntas permitidas (evita página fantasma al final). /admin/responses/[id]: respuestas agrupadas por sección (derivado de type='section', igual que el wizard — no existen section_number/ section_title, ver TECH-DEBT-011), instancias bajo "Familiar N". RLS y exclusión de sensibles intactos en ambas vistas. Fixes de revisión antes de cerrar: toggle expandir/colapsar movido a un <button> real (evita anidar el link "Ver" dentro de un role=button), formatDate/renderValue unificados en admin-format.ts, queries independientes en paralelo (Promise.all).
32 lines
707 B
TypeScript
32 lines
707 B
TypeScript
'use client'
|
|
|
|
import { useRouter } from 'next/navigation'
|
|
|
|
interface SurveyOption {
|
|
id: string
|
|
title: string
|
|
}
|
|
|
|
export function SurveySelect({ surveys, value }: { surveys: SurveyOption[]; value: string }) {
|
|
const router = useRouter()
|
|
|
|
return (
|
|
<select
|
|
className="admin-survey-select"
|
|
aria-label="Selección de encuesta"
|
|
value={value}
|
|
onChange={(e) => {
|
|
const id = e.target.value
|
|
router.push(id ? `/admin/responses?survey_id=${id}` : '/admin/responses')
|
|
}}
|
|
>
|
|
<option value="">Todos los surveys</option>
|
|
{surveys.map((s) => (
|
|
<option key={s.id} value={s.id}>
|
|
{s.title}
|
|
</option>
|
|
))}
|
|
</select>
|
|
)
|
|
}
|