e159e8d29746c426105eee0744addaa8fc1909d3
Perfil de usuario: - /perfil con avatar, matrícula, semestre, tutor, foto de perfil - /onboarding opcional (skippeable) para primer login - Avatar con prioridad: foto propia > Google OAuth > iniciales sobre color HSL - Endpoint PATCH /api/profile con validación y guard self-only - Middleware carga semestre, tutor_id, foto_path - Sidebar footer con Avatar + link a perfil CRUD admin de maestros: - /admin/maestros con tabla desktop / cards mobile - MaestroForm + EliminarMaestro (mismo patrón que categorias) - Endpoints POST/PATCH/DELETE con guard admin + 23503 traducido - Subnav de inventario ahora incluye tab Maestros Home reformulado: - Alumno: saludo por hora + CTA "¿Qué vas a pedir hoy?" + card de último préstamo activo - Admin: saludo + 2 KPIs de alerta (Pendientes, Vencidos) + últimas 2 pendientes + actividad reciente (tabla desktop, cards mobile — fix del bug 6) - Helper saludoHora() y fmtFechaRelativa() en date.ts con offset MX Checkout con tutor auto: - SolicitudCart: input maestro → textarea con placeholder = nombre del tutor - Guard perfil incompleto: CTA "Completa tu perfil" si !matricula || !tutor_id - RPC crear_solicitud: fallback automático al nombre del tutor si textarea vacío Fixes: - Bug upload imagen: Dockerfile ARG + docker-compose build.args pasan PUBLIC_* al bundle client de Vite - Grid inventario mobile: acciones en grid 2-col con prop compact en botones - UnidadesManager mobile: tabla reemplazada por cards, select estado con min-width 130px - Chart donut: Legend horizontal debajo (sin labels internos cortadas) - Chart barras: YAxis width fijo 100 + tickFormatter que trunca >14 chars - Panel admin mobile: tabla ahora tiene versión cards mobile (parte del rediseño home)
LabRe — Sistema de Préstamos LSC UABC
Aplicación web para gestionar préstamos de material del Laboratorio de Sistemas Computacionales (Facultad de Ingeniería, UABC). Modela el vale físico multi-ítem: un trámite agrupa varios materiales, cada renglón con cantidad y descripción.
Producción: https://prestamos.buglabs.dev · Login: exclusivo Google con correo @uabc.edu.mx
Roles
- Alumno: navega el catálogo con búsqueda por texto y filtro por categoría, arma un vale multi-ítem, consulta el estado de sus préstamos.
- Admin: aprueba/rechaza/marca devoluciones, gestiona inventario (grid con fotos), rastrea equipos por unidad individual (laptops, proyectores), reasigna unidades entre préstamos, consulta estadísticas con gráficas y exporta reportes CSV.
Stack
- Frontend: Astro 7 (SSR,
output: 'server') + React 19 islands + Tailwind v4 (tokens ensrc/styles/global.css) - Backend: Supabase self-hosted (Postgres 15, GoTrue, PostgREST, Storage, Realtime)
- Aislamiento: schema Postgres propio
prestamos(coexiste con otras apps en la misma instancia) - Auth: Google OAuth restringido a
@uabc.edu.mx(verificación a nivel aplicación en middleware) - Gráficas: recharts
- Hosting: Docker + adaptador
@astrojs/nodedetrás de Cloudflare Tunnel - CI/deploy: git +
docker compose up -d --builden el homelab
Requisitos
- Node 22.12+
- Acceso a una instancia de Supabase con el schema
prestamos(ver migraciones) - Cuenta Google
@uabc.edu.mxpara probar el flujo
Setup local
cp .env.example .env # llenar PUBLIC_SUPABASE_URL, PUBLIC_SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY, PUBLIC_APP_URL
npm install
npm run dev # http://localhost:4321
Antes del primer login, aplica las migraciones y promuévete a admin manualmente:
update prestamos.profiles set rol = 'admin' where email = 'tu-correo@uabc.edu.mx';
Base de datos
Migraciones en supabase/migrations/, aplican con psql -f <archivo> contra la instancia. Cada migración es idempotente (usa if not exists, drop policy if exists, etc.) y trae su propio BEGIN/COMMIT.
0001_init.sql— schema, tablas base, RLS, triggers, seed.0002_solicitudes_multi_item.sql— rediseño a "1 vale = N renglones", RPCcrear_solicitud.0003_grid_unidades_realtime.sql— imagen del material, unidades individuales, RPCreasignar_unidad, publication realtime, bucket públicomateriales-fotos.
Estructura
src/
├── layouts/
│ └── AppLayout.astro # sidebar desktop + dock móvil + toaster + badge realtime
├── lib/
│ ├── supabase.ts # server/browser clients (schema 'prestamos')
│ ├── date.ts # todayMX() con Intl + DST correcto
│ └── materialImg.ts # URL pública del bucket
├── middleware.ts # auth + dominio + verificación de rol
├── pages/
│ ├── login.astro
│ ├── alumno/
│ │ ├── catalogo.astro # grid + filtro categorías + buscador
│ │ └── mis-prestamos.astro
│ ├── admin/
│ │ ├── index.astro # panel con KPIs
│ │ ├── solicitudes/ # bandeja, activos, historial
│ │ ├── inventario/ # grid CRUD + categorías
│ │ ├── estadisticas.astro # 6 KPIs + 3 gráficas recharts
│ │ └── reportes.astro # filtros + export CSV
│ └── api/ # endpoints REST (guardados por middleware)
├── components/
│ ├── alumno/ # SolicitudCart, AgregarMaterial, FiltroCategorias, BuscadorCatalogo
│ ├── admin/ # solicitudes, inventario (MaterialForm, UnidadesManager), estadisticas (Chart), BadgeSolicitudes
│ └── Toaster.tsx # notificaciones globales estilo Sileo
└── styles/global.css # tokens paleta UABC + sistema neobrutalista
Deploy
Ver deploy/README.md para el detalle. Flujo resumido:
git push
ssh buglabs 'cd ~/labre-web && git pull && docker compose up -d --build'
Comandos
| Comando | Acción |
|---|---|
npm install |
Instala dependencias |
npm run dev |
Dev server en localhost:4321 |
npm run build |
Compila a ./dist/ (SSR bundle) |
npm run preview |
Preview del build |
Documentación interna
AGENTS.md— decisiones de arquitectura, bitácora de sesiones, backlog. Fuente única de verdad del progreso.DESIGN.md— sistema de diseño (paleta UABC, tipografía, sombra dura, Text-on-Fill Rule).PRODUCT.md— visión de producto y brand commitments.
Description
Sistema de prestamos de equipo de laboratorio para el laboratorio de sistemas computacionales de la uabc
Languages
TypeScript
48.7%
Astro
35.5%
PLpgSQL
14.1%
CSS
1.2%
Dockerfile
0.3%
Other
0.2%