Saved
This commit is contained in:
parent
77c6acdb2b
commit
5c14430075
|
|
@ -570,98 +570,91 @@ function texte_cp()
|
|||
|
||||
|
||||
/**
|
||||
* Ouvre le modal d'impression de quittance et charge son contenu via AJAX
|
||||
* de manière compatible Bootstrap 5 (sans casser le backdrop).
|
||||
* Ouvre le modal d'impression de quittance et charge son contenu via AJAX.
|
||||
* Utilise le déplacement DOM (Solution 3) pour éviter les conflits de z-index.
|
||||
*
|
||||
* @param {number|string} idQuittance - Identifiant de la quittance à imprimer
|
||||
*/
|
||||
function imprimer_quittance_client(idQuittance) {
|
||||
|
||||
/* ================================
|
||||
/* ===================================================
|
||||
* 1. Validation de l’identifiant
|
||||
* ================================ */
|
||||
* =================================================== */
|
||||
if (!idQuittance || parseInt(idQuittance) <= 0) {
|
||||
const v_msg = "Rien à imprimer !";
|
||||
const v_msgEng = "Nothing to print!";
|
||||
|
||||
// Utilisation de l’alerte métier si disponible
|
||||
if (typeof alert_ebene === "function") {
|
||||
alert_ebene(v_msg, v_msgEng);
|
||||
} else {
|
||||
alert(v_msg);
|
||||
}
|
||||
return; // Arrêt immédiat
|
||||
return;
|
||||
}
|
||||
|
||||
/* ================================
|
||||
* 2. Initialisation des références
|
||||
* ================================ */
|
||||
const racine = $("#racineWeb").val() || "/";
|
||||
|
||||
// Élément DOM du modal Bootstrap
|
||||
/* ===================================================
|
||||
* 2. Initialisation et EXTRACTION du Modal (Solution 3)
|
||||
* =================================================== */
|
||||
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');
|
||||
|
||||
/* ===================================================
|
||||
* 3. Préparation du contenu AVANT ouverture du modal
|
||||
* (évite les reflow destructeurs après show())
|
||||
* 3. Préparation visuelle (Spinner)
|
||||
* =================================================== */
|
||||
divExport.innerHTML = `
|
||||
<div class="text-center my-5 py-5">
|
||||
<div class="spinner-border text-primary" role="status"
|
||||
style="width: 3rem; height: 3rem;">
|
||||
<div class="spinner-border text-primary" role="status" style="width: 3rem; height: 3rem;">
|
||||
<span class="visually-hidden">Chargement...</span>
|
||||
</div>
|
||||
<p class="mt-3 text-muted fw-bold">
|
||||
Génération du document client en cours...
|
||||
</p>
|
||||
<p class="mt-3 text-muted fw-bold">Génération du document client en cours...</p>
|
||||
</div>
|
||||
`;
|
||||
|
||||
/* ===================================================
|
||||
* 4. Création ou récupération de l’instance Bootstrap
|
||||
* (Bootstrap 5 = gestion impérative par instance)
|
||||
* 4. Initialisation de l'instance Bootstrap
|
||||
* =================================================== */
|
||||
const modal = bootstrap.Modal.getOrCreateInstance(modalEl, {
|
||||
backdrop: 'static', // Empêche la fermeture au clic extérieur
|
||||
keyboard: false // Désactive la touche ESC
|
||||
backdrop: 'static',
|
||||
keyboard: false
|
||||
});
|
||||
|
||||
/* ===================================================
|
||||
* 5. Chargement AJAX APRES affichage du modal
|
||||
* (événement déclenché une seule fois)
|
||||
* 5. Gestion de l'événement d'affichage et AJAX
|
||||
* =================================================== */
|
||||
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({
|
||||
url: racine + "Ajaxexporterunequittanceclient/",
|
||||
type: 'POST',
|
||||
data: { idQuittance: idQuittance },
|
||||
|
||||
// Succès : injection directe du HTML (sans animation JS)
|
||||
success: function (data) {
|
||||
divExport.innerHTML = data;
|
||||
},
|
||||
|
||||
// Erreur : message utilisateur + log console
|
||||
error: function (xhr, status, error) {
|
||||
divExport.innerHTML = `
|
||||
<div class="alert alert-danger m-3 shadow-sm">
|
||||
<strong>Erreur :</strong>
|
||||
Impossible de générer la quittance.
|
||||
<strong>Erreur :</strong> Impossible de générer la quittance.
|
||||
<small class="d-block text-muted mt-1">${error}</small>
|
||||
</div>
|
||||
`;
|
||||
console.error("[Print] Erreur AJAX:", status, error);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
}, { once: true }); // Sécurise contre les appels multiples
|
||||
|
||||
/* ================================
|
||||
* 6. Ouverture propre du modal
|
||||
* ================================ */
|
||||
/* ===================================================
|
||||
* 6. Affichage final
|
||||
* =================================================== */
|
||||
modal.show();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -600,7 +600,7 @@ $activeChildId = $menuData['child'];
|
|||
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
||||
|
||||
<!-- 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()): ?>
|
||||
<script src="/Js/datepicker-eng.js"></script>
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user