/**
* INITIALISATION GÉNÉRALE
*/
/**
* Gère la pré-connexion via cookie (chargement du formulaire et focus intelligent).
* Récupère le login mémorisé et place le curseur dans le champ approprié.
*/
function connexion_cookie() {
const racine = $("#racineWeb").val() || "";
const msgErreur = $("#msgErreur").val();
$.ajax({
url: racine + "Ajaxconnexioncookie/",
type: 'POST',
cache: false,
// Utilisation d'un objet pour un encodage automatique sécurisé
data: { msgErreur: msgErreur },
success: function(data) {
// Injection du formulaire de connexion
$("#div_ajaxconnexion").html(data);
// Initialisation des composants stylisés
if ($.isFunction($.fn.selectpicker)) {
$(".selectpicker").selectpicker('refresh');
}
},
error: function(xhr, status, error) {
console.error("Erreur lors du chargement des cookies de connexion:", error);
},
complete: function() {
// Gestion intelligente du focus
const $loginField = $("#login");
const $mdpField = $("#mdp");
const $codeSocieteField = $("#codeSociete");
// Si un login est déjà présent (issu du cookie)
if ($loginField.val() && $loginField.val().trim() !== "") {
// On place le curseur sur le mot de passe
$mdpField.focus();
} else {
// Sinon, on commence par le début (Code Société ou Login)
if ($codeSocieteField.length > 0) {
$codeSocieteField.focus();
} else {
$loginField.focus();
}
}
}
});
}
$(function() {
// 1. Initialisation des composants au chargement de la page
appliquerDataTable('.tabliste');
// 2. Lancement du cycle de rafraîchissement automatique
const vueActuelle = $("#vue").val();
// On ne lance le timer que si l'utilisateur est connecté (pas sur la vue Connexion)
if (vueActuelle !== "Connexion") {
setInterval(function() {
// On vérifie si l'onglet est actif pour éviter des requêtes inutiles
if (!document.hidden) {
raffraichier_gabarit();
}
}, 60000); // 60 secondes
}
});
/**
* Fonction principale de rafraîchissement du gabarit (UI et Session)
* Gère la mise à jour des données et la redirection forcée en cas de déconnexion.
*/
function raffraichier_gabarit() {
const racine = $("#racineWeb").val() || "/";
const vueActuelle = $("#vue").val();
const codeLangue = $("#codeLangue").val() || "fr_FR";
$.ajax({
url: racine + "Ajaxgabarit/",
type: 'GET',
cache: false,
success: function(data) {
// 1. On transforme la chaîne 'data' en objet jQuery pour manipulation
const $dataFrag = $(data);
// 2. Injection dans le DOM
$("#div_ajaxgabarit").html($dataFrag);
// 3. RECUPERATION SECURISEE DU CODE SOCIETE
// On essaie d'abord dans le DOM, puis dans le fragment reçu si le DOM est lent
let codeSociete = $("#div_ajaxgabarit").find("#codeSociete").val()
|| $dataFrag.filter("#codeSociete").val()
|| $("#codeSociete").val();
// Debug en console pour vérifier la capture
console.log("Check Session - codeSociete trouvé :", codeSociete);
// 4. VERIFICATION DE LA SESSION
if ((!codeSociete || codeSociete.trim() === "") && vueActuelle !== "Connexion") {
const msg = "Votre session a expiré. Veuillez vous reconnecter.";
const msgEng = "Your session has expired. Please log in again.";
// On bloque l'écran avec confirm_ebene
confirm_ebene(msg, msgEng).then(() => {
window.location.assign(racine + "Connexion/deconnecter/");
});
return;
}
// Si on arrive ici, la session est valide
},
error: function(xhr) {
// Si le serveur renvoie une erreur HTTP (401, 403, 500)
if (xhr.status === 401 && vueActuelle !== "Connexion") {
window.location.assign(racine + "Connexion/deconnecter/");
}
},
complete: function() {
// Ré-initialisation des composants sur le nouveau HTML
if ($.isFunction($.fn.datepicker)) {
$(".datepicker").datepicker();
}
/*
if (typeof raffraichier_messagerie === "function") {
raffraichier_messagerie();
}
*/
}
});
}
/**
* GESTION DU MENU BURGER
* Gère l'affichage mobile et la fermeture lors d'un clic extérieur.
*/
document.addEventListener('DOMContentLoaded', () => {
const burgerToggle = document.getElementById('burgerMenuToggle');
const burgerDropdown = document.getElementById('burgerDropdown');
if (burgerToggle && burgerDropdown) {
// Alterne la classe 'show' au clic sur le bouton
burgerToggle.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
burgerDropdown.classList.toggle('show');
});
// Ferme le menu si on clique n'importe où ailleurs sur le document
document.addEventListener('click', (e) => {
if (!e.target.closest('.burger-menu-container')) {
burgerDropdown.classList.remove('show');
}
});
// Empêche la fermeture si on clique à l'intérieur du menu lui-même
burgerDropdown.addEventListener('click', (e) => e.stopPropagation());
}
});
/**
* FORMATAGE DES MESSAGES (Responsive)
* Ajoute des balises
pour forcer le retour à la ligne selon la taille d'écran.
*/
function formatMessageForSwal(message) {
if (!message) return '';
const screenWidth = window.innerWidth;
// Détermine la limite de caractères avant le saut de ligne
const maxLineLength = screenWidth < 576 ? 40 : (screenWidth < 768 ? 60 : 80);
if (message.length <= maxLineLength && !message.includes('\n')) return message;
const words = message.split(' ');
let lines = [];
let currentLine = '';
words.forEach(word => {
if ((currentLine + ' ' + word).length > maxLineLength && currentLine !== '') {
lines.push(currentLine);
currentLine = word;
} else {
currentLine = currentLine ? currentLine + ' ' + word : word;
}
});
if (currentLine) lines.push(currentLine);
return lines.join('
');
}
/**
* AJUSTEMENT DYNAMIQUE SWEETALERT
* Redimensionne la popup et gère le scroll interne pour les longs textes.
*/
function adjustSwalContent() {
const popup = Swal.getPopup();
const title = Swal.getTitle();
const htmlContainer = Swal.getHtmlContainer();
if (popup && title) {
const screenWidth = window.innerWidth;
// Application de styles responsives directs
if (screenWidth < 576) {
Object.assign(popup.style, { maxWidth: '95vw', width: '95vw', margin: '10px' });
} else {
Object.assign(popup.style, { maxWidth: screenWidth < 768 ? '85vw' : '500px', width: '100%' });
}
// Gestion du scroll si le titre est trop grand
const maxTitleHeight = Math.min(window.innerHeight * 0.6, 400);
if (title.scrollHeight > maxTitleHeight) {
Object.assign(title.style, { overflowY: 'auto', maxHeight: maxTitleHeight + 'px', paddingRight: '10px' });
}
}
}
/**
* WRAPPER GÉNÉRIQUE SWEETALERT
* Centralise les paramètres communs pour alert_ebene, confirm_ebene, etc.
*/
function baseSwal(options) {
return Swal.fire({
...options,
customClass: {
popup: 'responsive-swal-popup',
title: 'responsive-swal-title',
htmlContainer: 'responsive-swal-html'
},
didOpen: adjustSwalContent,
willOpen: () => { document.body.style.overflow = 'hidden'; },
willClose: () => { document.body.style.overflow = 'auto'; }
});
}
/**
* ALERTE SIMPLE
* Affiche une information bilingue.
*/
function alert_ebene(p_msg, p_msg_eng) {
const codeLangue = $("#codeLangue").val();
const message = (codeLangue === "en_US") ? p_msg_eng : p_msg;
baseSwal({
title: formatMessageForSwal(message),
icon: 'info',
confirmButtonText: codeLangue === "en_US" ? 'OK' : 'D\'accord'
});
}
/**
* CONFIRMATION
* Affiche une boîte de dialogue Oui/Non et retourne une promesse.
*/
function confirm_ebene(p_msg, p_msg_eng) {
const codeLangue = $("#codeLangue").val();
const message = (codeLangue === "en_US") ? p_msg_eng : p_msg;
return baseSwal({
title: formatMessageForSwal(message),
icon: 'warning',
showCancelButton: true,
confirmButtonText: codeLangue === "en_US" ? 'Yes' : 'Oui',
cancelButtonText: codeLangue === "en_US" ? 'No' : 'Non'
}).then(result => result.isConfirmed);
}
/**
* SAISIE TEXTE (PROMPT)
* Ouvre une modale avec champ de saisie et exécute un callback avec la valeur.
*/
function prompt_ebene(p_msg, p_msg_eng, p_retour, callback) {
const codeLangue = $("#codeLangue").val();
const message = (codeLangue === "en_US") ? p_msg_eng : p_msg;
baseSwal({
title: formatMessageForSwal(message),
input: 'text',
inputValue: p_retour,
showCancelButton: true,
confirmButtonText: 'OK',
cancelButtonText: codeLangue === "en_US" ? 'Cancel' : 'Annuler'
}).then(result => {
callback(result.isConfirmed ? result.value : null);
});
}
/**
* CHANGEMENT DE MOT DE PASSE
* Demande confirmation avant redirection.
*/
function change_password() {
const v_msg = "Attention, vous serez déconnecté par la suite! Voulez-vous changer votre mot de passe?";
const v_msgEng = "Attention, you will be logged out afterwards! Do you want to change your password?";
confirm_ebene(v_msg, v_msgEng).then(isConfirmed => {
if (isConfirmed) {
window.location.assign($("#racineWeb").val() + "Changermotpass/");
}
});
}
/**
* AFFICHAGE BÉNÉFICIAIRE
* Prépare le contexte serveur avant de charger la fiche bénéficiaire.
*/
function ajax_context_beneficiaire_afficher(idBeneficiaire, okId) {
// Affiche un loader pendant le chargement
$("#contenu").html('
Chargement des quittances...
Génération du document client en cours...