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:
@@ -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));
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user