--- import AppLayout from '@/layouts/AppLayout.astro'; const supabase = Astro.locals.supabase; const ALL = ['devuelto', 'rechazado', 'vencido'] as const; type EstadoHist = typeof ALL[number]; const raw = Astro.url.searchParams.get('estado'); const estadoFiltro = (raw && (ALL as readonly string[]).includes(raw) ? raw : '') as EstadoHist | ''; const estados = estadoFiltro ? [estadoFiltro] : Array.from(ALL); // ponytail: limit 200, paginar cuando pase de 500 filas const { data, error } = await supabase .from('prestamos') .select( 'id, cantidad, fecha_solicitud, fecha_devolucion_real, estado, notas, alumno:profiles!alumno_id(id, nombre, email, matricula), material:materiales!material_id(id, nombre, numero_inventario)' ) .in('estado', estados) .order('fecha_solicitud', { ascending: false }) .limit(200); const filas = data ?? []; const fmtFecha = new Intl.DateTimeFormat('es-MX', { dateStyle: 'medium', timeStyle: 'short' }); const path = Astro.url.pathname; const tabs = [ { href: '/admin/solicitudes', label: 'Pendientes' }, { href: '/admin/solicitudes/activos', label: 'En préstamo' }, { href: '/admin/solicitudes/historial', label: 'Historial' }, ]; const estadoLabel: Record = { devuelto: 'Devuelto', rechazado: 'Rechazado', vencido: 'Vencido', }; ---

Historial

{filas.length}
{error && ( )} {filas.length === 0 ? (

No hay registros para este filtro.

) : ( <>
    {filas.map((r: any) => (
  • {r.alumno?.nombre ?? '—'}
    {estadoLabel[r.estado] ?? r.estado}
    {r.alumno?.matricula ?? ''} {r.alumno?.email ? `· ${r.alumno.email}` : ''}
    {r.material?.nombre ?? '—'} · Cantidad {r.cantidad}
    Solicitado {fmtFecha.format(new Date(r.fecha_solicitud))}
    {r.fecha_devolucion_real &&
    Devuelto {fmtFecha.format(new Date(r.fecha_devolucion_real))}
    }
  • ))}
)}