-
`;
@@ -183,11 +178,30 @@ export function renderFacturasProveedoresPage() {
const searchInput = container.querySelector('#sup-search');
const filterSelect = container.querySelector('#sup-filter');
const summary = container.querySelector('#sup-summary');
- const overlay = container.querySelector('#sup-detail-overlay');
- const detailBody = container.querySelector('#sup-detail-body');
- const detailTitle = container.querySelector('#sup-detail-title');
- container.querySelector('#sup-detail-close').addEventListener('click', closeDetail);
- overlay.addEventListener('click', (e) => { if (e.target === overlay) closeDetail(); });
+ let detailView = null;
+ let detailBody = null;
+ let detailTitle = null;
+
+ function createDetailModal() {
+ const el = document.createElement('div');
+ el.className = 'sup-modal-backdrop';
+ el.innerHTML = `
+
`;
+ el.querySelector('#sup-detail-close').addEventListener('click', closeDetail);
+ el.addEventListener('click', e => { if (e.target === el) closeDetail(); });
+ document.body.appendChild(el);
+ detailView = el;
+ detailBody = el.querySelector('#sup-detail-body');
+ detailTitle = el.querySelector('#sup-detail-title');
+ }
function applyFilters() {
filteredInvoices = allInvoices.filter(inv => {
@@ -254,37 +268,43 @@ export function renderFacturasProveedoresPage() {
container.querySelector('#sum-pending').textContent = fmt(pending);
}
+ function isModalOpen() {
+ return detailView && detailView.isConnected;
+ }
+
async function openDetail(id) {
- overlay.style.display = 'flex';
- detailTitle.textContent = 'Cargando...';
- detailBody.innerHTML = '
Cargando detalle...
';
+ if (isModalOpen()) closeDetail();
+ createDetailModal();
payments = [];
- // Load payment types once per page instance
if (paymentTypes.length === 0) {
try { paymentTypes = await getPaymentTypes(); } catch { paymentTypes = []; }
}
+ if (!isModalOpen()) return;
+
try {
const inv = await getSupplierInvoiceById(id);
+ if (!isModalOpen()) return;
currentInvoice = inv;
- detailTitle.textContent = `Factura ${inv.number}`;
await loadPayments(id);
+ if (!isModalOpen()) return;
renderDetail(inv);
} catch (err) {
+ if (!isModalOpen()) return;
detailBody.innerHTML = `
No se pudo cargar el detalle: ${escHtml(err.message)}
`;
}
}
async function refreshDetail() {
- if (!currentInvoice) return;
+ if (!currentInvoice || !isModalOpen()) return;
try {
const inv = await getSupplierInvoiceById(currentInvoice.id);
+ if (!isModalOpen()) return;
currentInvoice = inv;
- detailTitle.textContent = `Factura ${inv.number}`;
await loadPayments(inv.id);
+ if (!isModalOpen()) return;
renderDetail(inv);
- // Refresh list row too
const idx = allInvoices.findIndex(x => x.id === inv.id);
if (idx >= 0) allInvoices[idx] = { ...allInvoices[idx], ...inv };
applyFilters();
@@ -306,51 +326,50 @@ export function renderFacturasProveedoresPage() {
const isUnpaid = inv.status === 'unpaid';
const lines = inv.lines || [];
+ // Update title with status badge
+ detailTitle.innerHTML = `${escHtml(inv.number || '—')}
${STATUS_TEXT[inv.status] || inv.status}`;
+
detailBody.innerHTML = /*html*/`
-
-
-
-
Proveedor
-
${escHtml(inv.supplierName || '—')}
+
+