Control de respuestas
No fue posible conectarse a la base de datos.
{questionsError.message}
import { createClient } from '@supabase/supabase-js' import { ResponsesTable, type DisplayRow } from './responses-table' // Server Component sin auth — herramienta interna de diagnóstico (Etapa 3V-B). // Usa SUPABASE_SERVICE_ROLE_KEY: vive solo acá, server-side, nunca al cliente. export const dynamic = 'force-dynamic' const MAX_SUBMISSIONS = 500 const PROMPT_MAX_LEN = 60 interface AllowedQuestion { id: string code: string prompt: string type: string position: number } interface AnswerRow { value: unknown question_id: string } interface ResponseRow { id: string submitted_at: string qi_zone: string | null qi_sector: string | null answers: AnswerRow[] } function getSupabaseAdmin() { const url = process.env.NEXT_PUBLIC_SUPABASE_URL || 'https://placeholder.supabase.co' const serviceKey = process.env.SUPABASE_SERVICE_ROLE_KEY || 'placeholder' return createClient(url, serviceKey, { auth: { persistSession: false } }) } function formatDate(iso: string): string { const d = new Date(iso) const pad = (n: number) => String(n).padStart(2, '0') return `${pad(d.getDate())}/${pad(d.getMonth() + 1)}/${d.getFullYear()} ${pad(d.getHours())}:${pad(d.getMinutes())}` } function truncate(text: string, max = PROMPT_MAX_LEN): string { return text.length > max ? `${text.slice(0, max)}...` : text } // Spec 4.3 — null/undefined → null (renderizado como badge "sin dato") function renderValue(value: unknown, type: string): string | null { if (value === null || value === undefined) return null switch (type) { case 'single_choice': case 'text_short': return String(value).replace(/^"|"$/g, '') case 'multiple_choice': if (Array.isArray(value)) return value.join(', ') return String(value) case 'rating': return String(value) default: return String(value) } } export default async function AdminResponsesPage() { const supabase = getSupabaseAdmin() // 1. Preguntas permitidas — text_long e is_sensitive=true se excluyen ACÁ, // antes de tocar la tabla answers. Sus valores nunca se consultan. const { data: questionsData, error: questionsError } = await supabase .from('questions') .select('id, code, prompt, type, position') .eq('is_sensitive', false) .neq('type', 'text_long') .order('position', { ascending: true }) if (questionsError) { return (
No fue posible conectarse a la base de datos.
{questionsError.message}
No fue posible conectarse a la base de datos.
{responsesError.message}
{totalSubmissions ?? 0} submissions · {totalAnswers ?? 0} respuestas individuales · actualizado {formatDate(new Date().toISOString())}
Sin respuestas registradas todavía.
)}