get_clienti.php, get_fixed_field_data.php: simulate mode support CustomField dropdown values mock added (get_customfield_values.php) exportUnsavedModal: prompt save before export, MutationObserver waits for save, then proceeds to confirm Removed old jQuery .export-lims-btn handler that bypassed confirm modal Fix false "Unsaved changes" on page load: data-restoring guard in all programmatic trigger/dispatchEvent calls (populateSelect, populateClientDropdowns, populateDropdowns) Fix ConsegnaRichiesta not shown on refresh: add to PHP $fixedAliasMap Add step5_2_photos, step9_1_importa
222 lines
9.0 KiB
JavaScript
222 lines
9.0 KiB
JavaScript
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, "<br>")}` +
|
|
`<br>ID CommessaWeb: ${data.idcommessaweb}` +
|
|
`<br>Codice CommessaWeb: ${data.commessaweb}` +
|
|
(data.totalPhotos > 0
|
|
? `<br>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);
|
|
});
|
|
});
|
|
});
|