document.addEventListener("DOMContentLoaded", () => { console.log("export_to_lims.js loaded"); const exportButtons = document.querySelectorAll(".export-lims-btn"); console.log(`Found ${exportButtons.length} export-lims-btn buttons`); if (exportButtons.length === 0) { console.warn("No .export-lims-btn buttons found in the DOM"); return; } // Tracks the active confirm handler so it can be replaced on re-open let pendingConfirmHandler = null; // ── Helpers ────────────────────────────────────────────────────────────── function cleanupBackdrop() { document.querySelectorAll(".modal-backdrop").forEach((b) => b.remove()); document.body.classList.remove("modal-open"); document.body.style.paddingRight = ""; const overlay = document.querySelector(".overlay.toggle-icon"); if (overlay) overlay.style.display = "none"; } // ── Step 2: show export-confirm modal, send on "Conferma" ──────────────── function startExportConfirmFlow(iddatadb, btn) { const confirmModalElement = document.getElementById("exportConfirmModal"); if (!confirmModalElement) { alert("Errore: Modale di conferma non trovato"); return; } const confirmModal = new bootstrap.Modal(confirmModalElement, { keyboard: false, }); document.getElementById("exportIddatadb").textContent = iddatadb; confirmModal.show(); const confirmBtn = document.getElementById("exportConfirmBtn"); if (!confirmBtn) { confirmModal.hide(); alert("Errore: Pulsante di conferma non trovato"); return; } const confirmHandler = async () => { pendingConfirmHandler = null; console.log(`Confirmed export for iddatadb: ${iddatadb}`); confirmModal.hide(); const formData = new FormData(); formData.append("iddatadb", iddatadb); try { const response = await fetch("export_to_lims.php", { method: "POST", body: formData, }); if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); const data = await response.json(); console.log("Export response:", data); const responseModalElement = document.getElementById("exportResponseModal"); if (!responseModalElement) { alert("Errore: Modale di risposta non trovato"); return; } const responseModal = new bootstrap.Modal( responseModalElement, { keyboard: false }, ); const responseMessage = document.getElementById( "exportResponseMessage", ); if (data.success) { responseMessage.innerHTML = `${data.message.replace(/\n/g, "
")}` + `
ID CommessaWeb: ${data.idcommessaweb}` + `
Codice CommessaWeb: ${data.commessaweb}` + (data.totalPhotos > 0 ? `
Foto trovate: ${data.totalPhotos}` : ""); document.getElementById( "exportResponseModalLabel", ).textContent = "Esportazione Completata"; responseModal.show(); // Update status badge const gridRow = btn.closest(".grid-row"); const statusBadge = gridRow?.querySelector( '.grid-cell[data-col="status"] .status-badge', ); if (statusBadge) { statusBadge.classList.remove("status-i", "status-P"); statusBadge.classList.add("status-l"); statusBadge.textContent = "To LIMS"; } // Insert/update CommessaWeb code span const statusCell = gridRow?.querySelector( '.grid-cell[data-col="status"]', ); if (statusCell && data.commessaweb) { let cwSpan = statusCell.querySelector(".commessaweb-code"); if (!cwSpan) { cwSpan = document.createElement("span"); cwSpan.className = "commessaweb-code"; cwSpan.style.cssText = "display:block; font-size:0.75em; color:#555; margin-top:2px;"; cwSpan.title = "CommessaWeb"; const hiddenInput = statusCell.querySelector( 'input[type="hidden"]', ); hiddenInput ? statusCell.insertBefore(cwSpan, hiddenInput) : statusCell.appendChild(cwSpan); } cwSpan.textContent = data.commessaweb; } } else { responseMessage.textContent = `Errore durante la generazione dei payload: ${data.message}`; document.getElementById( "exportResponseModalLabel", ).textContent = "Errore Esportazione"; responseModal.show(); } responseModalElement.addEventListener( "hidden.bs.modal", cleanupBackdrop, { once: true }, ); } catch (error) { console.error("Export error:", error); const responseModalElement = document.getElementById("exportResponseModal"); if (!responseModalElement) { alert("Errore: Modale di risposta non trovato"); return; } const responseModal = new bootstrap.Modal( responseModalElement, { keyboard: false }, ); document.getElementById( "exportResponseMessage", ).textContent = `Errore: ${error.message}`; document.getElementById( "exportResponseModalLabel", ).textContent = "Errore Esportazione"; responseModal.show(); responseModalElement.addEventListener( "hidden.bs.modal", cleanupBackdrop, { once: true }, ); } }; if (pendingConfirmHandler) { confirmBtn.removeEventListener("click", pendingConfirmHandler); } pendingConfirmHandler = confirmHandler; confirmBtn.addEventListener("click", confirmHandler, { once: true }); } // ── Step 1: check unsaved changes, save if needed, then export ─────────── exportButtons.forEach((btn) => { btn.addEventListener("click", (e) => { e.preventDefault(); const rowIndex = btn.dataset.row; const iddatadb = btn.dataset.iddatadb; console.log( `Export to LIMS clicked for row ${rowIndex}, iddatadb: ${iddatadb}`, ); const gridRow = btn.closest(".grid-row"); if (gridRow && gridRow.querySelector(".cell-changed")) { const unsavedModal = new bootstrap.Modal( document.getElementById("exportUnsavedModal"), { keyboard: false }, ); unsavedModal.show(); document.getElementById("saveAndExportBtn").addEventListener("click", () => { unsavedModal.hide(); const saveBtn = gridRow.querySelector(".save-btn"); if (!saveBtn) return; const observer = new MutationObserver(() => { if (!gridRow.querySelector(".cell-changed")) { observer.disconnect(); startExportConfirmFlow(iddatadb, btn); } }); observer.observe(gridRow, { subtree: true, attributes: true, attributeFilter: ["class"], }); saveBtn.click(); }, { once: true }); return; } // No unsaved changes — go straight to export confirm startExportConfirmFlow(iddatadb, btn); }); }); });