This commit is contained in:
KONE SOREL 2025-12-29 12:45:46 +00:00
parent 77c6acdb2b
commit 5c14430075
2 changed files with 35 additions and 42 deletions

View File

@ -570,98 +570,91 @@ function texte_cp()
/** /**
* Ouvre le modal d'impression de quittance et charge son contenu via AJAX * Ouvre le modal d'impression de quittance et charge son contenu via AJAX.
* de manière compatible Bootstrap 5 (sans casser le backdrop). * Utilise le déplacement DOM (Solution 3) pour éviter les conflits de z-index.
* *
* @param {number|string} idQuittance - Identifiant de la quittance à imprimer * @param {number|string} idQuittance - Identifiant de la quittance à imprimer
*/ */
function imprimer_quittance_client(idQuittance) { function imprimer_quittance_client(idQuittance) {
/* ================================ /* ===================================================
* 1. Validation de lidentifiant * 1. Validation de lidentifiant
* ================================ */ * =================================================== */
if (!idQuittance || parseInt(idQuittance) <= 0) { if (!idQuittance || parseInt(idQuittance) <= 0) {
const v_msg = "Rien à imprimer !"; const v_msg = "Rien à imprimer !";
const v_msgEng = "Nothing to print!"; const v_msgEng = "Nothing to print!";
// Utilisation de lalerte métier si disponible
if (typeof alert_ebene === "function") { if (typeof alert_ebene === "function") {
alert_ebene(v_msg, v_msgEng); alert_ebene(v_msg, v_msgEng);
} else { } else {
alert(v_msg); alert(v_msg);
} }
return; // Arrêt immédiat return;
} }
/* ================================ /* ===================================================
* 2. Initialisation des références * 2. Initialisation et EXTRACTION du Modal (Solution 3)
* ================================ */ * =================================================== */
const racine = $("#racineWeb").val() || "/";
// Élément DOM du modal Bootstrap
const modalEl = document.getElementById('pop_export_quittance'); const modalEl = document.getElementById('pop_export_quittance');
if (!modalEl) {
console.error("Erreur : Le modal #pop_export_quittance est introuvable dans le DOM.");
return;
}
// Conteneur qui recevra le contenu AJAX // On déplace le modal directement sous <body> s'il n'y est pas déjà.
// Cela permet de passer outre les z-index des conteneurs parents (Sidebar, Header).
if (modalEl.parentElement !== document.body) {
document.body.appendChild(modalEl);
}
const racine = $("#racineWeb").val() || "/";
const divExport = document.getElementById('div_export_quittance'); const divExport = document.getElementById('div_export_quittance');
/* =================================================== /* ===================================================
* 3. Préparation du contenu AVANT ouverture du modal * 3. Préparation visuelle (Spinner)
* (évite les reflow destructeurs après show())
* =================================================== */ * =================================================== */
divExport.innerHTML = ` divExport.innerHTML = `
<div class="text-center my-5 py-5"> <div class="text-center my-5 py-5">
<div class="spinner-border text-primary" role="status" <div class="spinner-border text-primary" role="status" style="width: 3rem; height: 3rem;">
style="width: 3rem; height: 3rem;">
<span class="visually-hidden">Chargement...</span> <span class="visually-hidden">Chargement...</span>
</div> </div>
<p class="mt-3 text-muted fw-bold"> <p class="mt-3 text-muted fw-bold">Génération du document client en cours...</p>
Génération du document client en cours...
</p>
</div> </div>
`; `;
/* =================================================== /* ===================================================
* 4. Création ou récupération de linstance Bootstrap * 4. Initialisation de l'instance Bootstrap
* (Bootstrap 5 = gestion impérative par instance)
* =================================================== */ * =================================================== */
const modal = bootstrap.Modal.getOrCreateInstance(modalEl, { const modal = bootstrap.Modal.getOrCreateInstance(modalEl, {
backdrop: 'static', // Empêche la fermeture au clic extérieur backdrop: 'static',
keyboard: false // Désactive la touche ESC keyboard: false
}); });
/* =================================================== /* ===================================================
* 5. Chargement AJAX APRES affichage du modal * 5. Gestion de l'événement d'affichage et AJAX
* (événement déclenché une seule fois)
* =================================================== */ * =================================================== */
modalEl.addEventListener('shown.bs.modal', function () { // On utilise 'shown.bs.modal' pour lancer l'AJAX une fois le modal visible
$(modalEl).one('shown.bs.modal', function () {
$.ajax({ $.ajax({
url: racine + "Ajaxexporterunequittanceclient/", url: racine + "Ajaxexporterunequittanceclient/",
type: 'POST', type: 'POST',
data: { idQuittance: idQuittance }, data: { idQuittance: idQuittance },
// Succès : injection directe du HTML (sans animation JS)
success: function (data) { success: function (data) {
divExport.innerHTML = data; divExport.innerHTML = data;
}, },
// Erreur : message utilisateur + log console
error: function (xhr, status, error) { error: function (xhr, status, error) {
divExport.innerHTML = ` divExport.innerHTML = `
<div class="alert alert-danger m-3 shadow-sm"> <div class="alert alert-danger m-3 shadow-sm">
<strong>Erreur :</strong> <strong>Erreur :</strong> Impossible de générer la quittance.
Impossible de générer la quittance.
<small class="d-block text-muted mt-1">${error}</small> <small class="d-block text-muted mt-1">${error}</small>
</div> </div>
`; `;
console.error("[Print] Erreur AJAX:", status, error);
} }
}); });
});
}, { once: true }); // Sécurise contre les appels multiples /* ===================================================
* 6. Affichage final
/* ================================ * =================================================== */
* 6. Ouverture propre du modal
* ================================ */
modal.show(); modal.show();
} }

View File

@ -600,7 +600,7 @@ $activeChildId = $menuData['child'];
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script> <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<!-- Application Scripts --> <!-- Application Scripts -->
<script src="/Js/fonctions.js?ver=2025.12.29.00"></script> <script src="/Js/fonctions.js?ver=2025.12.29.01"></script>
<?php if (est_anglophone()): ?> <?php if (est_anglophone()): ?>
<script src="/Js/datepicker-eng.js"></script> <script src="/Js/datepicker-eng.js"></script>