# SUBAGENTE SA-013: Exports Frontend UI ## Metadata | Campo | Valor | |-------|-------| | ID | SA-013 | | Agent ID | a399aad | | Tipo | general-purpose | | Perfil | Frontend Developer | | Tarea | T5.1-FE | | Estado | COMPLETADO | | Commit | 1b2fca8 | | Dependencia | SA-008 (Exports Backend) | --- ## Prompt Enviado ```markdown ## TAREA: Implementar UI de Exportación PDF/Excel **Proyecto:** michangarrito **Ubicación:** /home/isem/workspace-v2/projects/michangarrito ### CONTEXTO El backend ya tiene el módulo de exports implementado (SA-008). Se necesita crear la UI en el frontend para permitir exportar reportes desde Dashboard, Inventory y Fiado. ### REFERENCIAS A CONSULTAR 1. `frontend/src/lib/api.ts` - Agregar exportsApi 2. `backend/src/modules/exports/exports.controller.ts` - Endpoints disponibles 3. `frontend/src/pages/Dashboard.tsx` - Agregar botón de export 4. `frontend/src/pages/Inventory.tsx` - Agregar botón de export 5. `frontend/src/pages/Fiado.tsx` - Agregar botón de export ### APIs A IMPLEMENTAR EN api.ts ```typescript export const exportsApi = { dashboardPdf: (filters) => api.post('/v1/exports/pdf/dashboard', filters, { responseType: 'blob' }), dashboardExcel: (filters) => api.post('/v1/exports/excel/dashboard', filters, { responseType: 'blob' }), inventoryPdf: (filters) => api.post('/v1/exports/pdf/inventory', filters, { responseType: 'blob' }), inventoryExcel: (filters) => api.post('/v1/exports/excel/inventory', filters, { responseType: 'blob' }), fiadosPdf: (filters) => api.post('/v1/exports/pdf/fiados', filters, { responseType: 'blob' }), fiadosExcel: (filters) => api.post('/v1/exports/excel/fiados', filters, { responseType: 'blob' }) }; ``` ### COMPONENTE A CREAR ```typescript // ExportButton.tsx interface ExportButtonProps { type: 'dashboard' | 'inventory' | 'fiados'; filters?: ExportFilters; } ``` ### INSTRUCCIONES 1. Agregar exportsApi en `api.ts` 2. Crear componente `ExportButton.tsx`: - Dropdown con opciones PDF/Excel - Manejo de descarga de blob - Estado de loading 3. Agregar ExportButton en: - Dashboard.tsx (esquina superior derecha) - Inventory.tsx (junto a filtros) - Fiado.tsx (junto a filtros) 4. Implementar descarga de archivo: ```typescript const downloadFile = (blob, filename) => { const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; a.click(); URL.revokeObjectURL(url); }; ``` 5. Hacer commit con mensaje: `[MCH-FE] feat: Add export UI for PDF/Excel` 6. Push al remote ### VALIDACIONES - Build debe pasar: `npm run build` - Descarga debe funcionar correctamente ``` --- ## Contexto Adicional Proporcionado - Referencia al backend ya implementado (SA-008) - Endpoints específicos por tipo de reporte - Patrón de descarga de archivos blob --- ## Resultado ### Archivos Modificados/Creados | Archivo | Cambios | |---------|---------| | `frontend/src/lib/api.ts` | +exportsApi | | `frontend/src/components/ExportButton.tsx` | Nuevo componente | | `frontend/src/pages/Dashboard.tsx` | +ExportButton | | `frontend/src/pages/Inventory.tsx` | +ExportButton | | `frontend/src/pages/Fiado.tsx` | +ExportButton | ### Cambios Implementados 1. **Exports API en api.ts:** ```typescript export const exportsApi = { dashboardPdf: (filters?: ExportFilters) => api.post('/v1/exports/pdf/dashboard', filters, { responseType: 'blob' }).then(r => r.data), dashboardExcel: (filters?: ExportFilters) => api.post('/v1/exports/excel/dashboard', filters, { responseType: 'blob' }).then(r => r.data), // ... otros endpoints }; ``` 2. **ExportButton Component:** ```tsx export const ExportButton = ({ type, filters }: ExportButtonProps) => { const [isOpen, setIsOpen] = useState(false); const [isLoading, setIsLoading] = useState(false); const handleExport = async (format: 'pdf' | 'excel') => { setIsLoading(true); try { const api = format === 'pdf' ? exportsApi[`${type}Pdf`] : exportsApi[`${type}Excel`]; const blob = await api(filters); downloadFile(blob, `${type}-report.${format === 'pdf' ? 'pdf' : 'xlsx'}`); } finally { setIsLoading(false); } }; return (