Some checks are pending
CI/CD Pipeline / Backend CI (push) Waiting to run
CI/CD Pipeline / Frontend CI (push) Waiting to run
CI/CD Pipeline / WhatsApp Service CI (push) Waiting to run
CI/CD Pipeline / Mobile CI (push) Waiting to run
CI/CD Pipeline / Docker Build (./apps/backend, ./apps/backend/Dockerfile, backend) (push) Blocked by required conditions
CI/CD Pipeline / Docker Build (./apps/frontend, ./apps/frontend/Dockerfile, frontend) (push) Blocked by required conditions
CI/CD Pipeline / Docker Build (./apps/whatsapp-service, ./apps/whatsapp-service/Dockerfile, whatsapp-service) (push) Blocked by required conditions
CI/CD Pipeline / Deploy to Production (push) Blocked by required conditions
- Move 7 non-standard folders to _archive/ - Archive 3 extra root files - Update _MAP.md with standardized structure Standard: SIMCO-ESTANDAR-ORCHESTRATION v1.0.0 Level: CONSUMER (L2) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
5.3 KiB
5.3 KiB
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
## 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
// ExportButton.tsx
interface ExportButtonProps {
type: 'dashboard' | 'inventory' | 'fiados';
filters?: ExportFilters;
}
INSTRUCCIONES
- Agregar exportsApi en
api.ts - Crear componente
ExportButton.tsx:- Dropdown con opciones PDF/Excel
- Manejo de descarga de blob
- Estado de loading
- Agregar ExportButton en:
- Dashboard.tsx (esquina superior derecha)
- Inventory.tsx (junto a filtros)
- Fiado.tsx (junto a filtros)
- Implementar descarga de archivo:
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); }; - Hacer commit con mensaje:
[MCH-FE] feat: Add export UI for PDF/Excel - 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
};
-
ExportButton Component:
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 ( <div className="relative"> <Button onClick={() => setIsOpen(!isOpen)}> <Download className="w-4 h-4 mr-2" /> Exportar </Button> {isOpen && ( <div className="dropdown-menu"> <button onClick={() => handleExport('pdf')}> <FileText className="w-4 h-4" /> PDF </button> <button onClick={() => handleExport('excel')}> <Table className="w-4 h-4" /> Excel </button> </div> )} </div> ); }; -
Integración en páginas:
// Dashboard.tsx <div className="flex justify-between items-center"> <h1>Dashboard</h1> <ExportButton type="dashboard" /> </div>
Lecciones del Subagente
Que funcionó bien
- El componente ExportButton es reutilizable
- La descarga de blob funciona correctamente
- El dropdown es intuitivo
Mejoras sugeridas
- Agregar selector de rango de fechas
- Mostrar preview antes de exportar
- Agregar opción de enviar por email