--- import AppLayout from '@/layouts/AppLayout.astro'; import CartProvider from '@/components/alumno/SolicitudCart.tsx'; import FiltroCategorias from '@/components/alumno/FiltroCategorias.tsx'; import BuscadorCatalogo from '@/components/alumno/BuscadorCatalogo.tsx'; const qInitial = Astro.url.searchParams.get('q') ?? ''; const supabase = Astro.locals.supabase; const userId = Astro.locals.user?.id; const rol = Astro.locals.profile?.rol ?? 'alumno'; const esDocente = rol === 'docente'; // Trae matricula + tutor_id directo (el middleware sólo hidrata columnas antiguas). let matricula: string | null = null; let tutorId: number | null = null; if (userId) { const { data: p } = await supabase .from('profiles') .select('matricula, tutor_id') .eq('id', userId) .maybeSingle(); matricula = p?.matricula ?? null; tutorId = (p as { tutor_id?: number | null } | null)?.tutor_id ?? null; } let tutorNombre: string | null = null; if (tutorId) { const { data } = await supabase.from('maestros').select('nombre').eq('id', tutorId).maybeSingle(); tutorNombre = data?.nombre ?? null; } // Docente: solo requiere matrícula (número de empleado). Alumno: matrícula + tutor. const perfilCompleto = esDocente ? !!matricula : !!(matricula && tutorId); // Lista completa de maestros activos para el combobox del checkout (solo alumno lo usa). type MaestroOpt = { id: number; nombre: string }; let maestros: MaestroOpt[] = []; if (!esDocente) { const { data: ms } = await supabase .from('maestros') .select('id, nombre') .eq('activo', true) .order('nombre'); maestros = (ms ?? []) as MaestroOpt[]; } type Material = { id: number; nombre: string; descripcion: string | null; cantidad_disponible: number; cantidad_total: number; numero_inventario: string | null; imagen_path: string | null; categoria: { id: number; nombre: string } | null; }; const { data, error } = await Astro.locals.supabase .from('materiales') .select('id, nombre, descripcion, cantidad_disponible, cantidad_total, numero_inventario, imagen_path, categoria:categorias(id, nombre)') .eq('estado', 'disponible') .order('nombre'); const materiales = (data ?? []) as unknown as Material[]; const grupos = new Map(); for (const m of materiales) { const key = m.categoria ? String(m.categoria.id) : 'sin'; const nombre = m.categoria?.nombre ?? 'Sin categoría'; if (!grupos.has(key)) grupos.set(key, { id: m.categoria?.id ?? null, nombre, items: [] }); grupos.get(key)!.items.push(m); } const grupoList = Array.from(grupos.values()).sort((a, b) => a.nombre.localeCompare(b.nombre, 'es')); const categoriasFiltro = grupoList .filter((g) => g.id !== null) .map((g) => ({ id: g.id as number, nombre: g.nombre })); ---

Catálogo

Material disponible en el Laboratorio de Sistemas.

{error && ( )} {materiales.length === 0 && !error && (

Aún no hay material publicado

Vuelve pronto o contacta al encargado del laboratorio.

)} {materiales.length > 0 && ( <>
{categoriasFiltro.length > 0 && ( )}
)}