feat(export): UI unificada de Excel + PDF en los 4 módulos

- Nuevos assets compartidos /assets/donna-export.{css,js}: botón
  "Exportar ▾" + menú dropdown Excel/PDF y helpers DonnaExport.toExcel
  / .toPDF / .attach / .buttonHtml
- escrituras: refactor de exportExcel/exportPDF para usar el módulo
  compartido (sin cambio de comportamiento)
- tramites: nuevo botón en la toolbar de cada tab (adm/corp/mig/lit),
  exporta los rows filtrados de ese tab; PDF excluye Involucrados
- calendario: nuevo botón al final de la toolbar, exporta visibleEvents()
  (respeta chips de origen y búsqueda)
- horas: reemplaza CSV server-side por XLSX client-side + agrega PDF;
  removida la acción ?action=export del api.php
This commit is contained in:
Soporte ZH Consultores
2026-06-04 22:30:37 -05:00
parent 012c4e1c66
commit eff590af47
7 changed files with 377 additions and 236 deletions
+43
View File
@@ -283,6 +283,7 @@ footer.legend { text-align:center; padding:14px 24px 24px; font-size:11px; color
footer.legend .pill { display:inline-block; padding:2px 8px; border-radius:20px; color:#fff;
font-weight:600; margin:0 2px; font-size:10.5px; }
</style>
<link rel="stylesheet" href="/assets/donna-export.css">
</head>
<body>
@@ -342,6 +343,7 @@ footer.legend .pill { display:inline-block; padding:2px 8px; border-radius:20px;
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M12 5v14M5 12h14"/></svg>
Nuevo evento
</button>
<div id="export-mount"></div>
</div>
<div class="cal-kpis">
@@ -444,6 +446,8 @@ footer.legend .pill { display:inline-block; padding:2px 8px; border-radius:20px;
<div class="toast" id="toast"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
<script src="/assets/donna-export.js"></script>
<script>
const DEPT_LABELS = {adm:'Administrativo', corp:'Corporativo', mig:'Migración', lit:'Litigios'};
const SRC_LABELS = {esc:'Escrituras', adm:'Trámites Admin', corp:'Trámites Corp', mig:'Trámites Mig', lit:'Trámites Lit', manual:'Evento'};
@@ -1094,6 +1098,45 @@ function renderEventBody(e){
return rows.map(([k,v])=>`<div class="row"><div class="k">${k}</div><div class="v">${v}</div></div>`).join('');
}
// ── EXPORT (Calendario) ────────────────────────────────────────────────
const CAL_HEADERS = ['Fecha','Hora','Origen','Tipo','Título','Cliente / Ubicación','Abogado / Creador','Estatus','Código'];
function calRowToArray(e){
const tipoLabel = (e.source === 'manual')
? (MANUAL_TIPO_LABELS[e.type] || 'Evento')
: (({solicitud:'Solicitud', vencimiento:'Vencimiento', termino:'Término procesal'})[e.type] || e.type);
const hora = (e.source === 'manual' && e.manual_hi)
? (e.manual_hi.substring(0,5) + (e.manual_hf ? '–'+e.manual_hf.substring(0,5) : ''))
: '';
const titleBase = (e.source === 'manual') ? (e.manual_titulo || e.title) : e.title;
return [
e.date, hora,
SRC_LABELS[e.source] || e.source,
tipoLabel, titleBase,
e.cliente || '', e.abogado || '',
e.estatus || '', e.codigo || '',
];
}
function calExportRows(){ return visibleEvents().map(calRowToArray); }
function calExportExcel(){
DonnaExport.toExcel({
filename: 'Calendario_AALN', sheetName: 'Eventos',
headers: CAL_HEADERS, rows: calExportRows(),
columnWidths: [12,14,16,18,38,28,22,16,12],
onEmpty: () => toast('No hay eventos para exportar','error'),
});
}
function calExportPDF(){
DonnaExport.toPDF({
filename: 'Calendario_AALN',
title: 'Calendario de Eventos',
headers: CAL_HEADERS, rows: calExportRows(),
pdfCols: [0,1,2,3,4,5,6,7],
onEmpty: () => toast('No hay eventos para exportar','error'),
});
}
document.getElementById('export-mount').innerHTML = DonnaExport.buttonHtml();
DonnaExport.attach('export-wrap', { onExcel: calExportExcel, onPDF: calExportPDF });
document.querySelectorAll('#view-tabs button').forEach(b=>{
b.addEventListener('click', ()=> setView(b.dataset.view));
});