Merge branch 'main' of git.ebene.ovh:ebene/radiantrh

This commit is contained in:
KANE LAZENI 2026-03-09 05:39:41 +00:00
commit e4b316a394
13 changed files with 397 additions and 53 deletions

View File

@ -0,0 +1,100 @@
/* Style isolé pour le centre d'aide - Position GAUCHE */
#helpButton {
position: fixed;
bottom: 25px;
left: 25px; /* Changé de right à left pour libérer le bouton de session */
width: 55px;
height: 55px;
background: #004a99;
color: #fff;
border: none;
border-radius: 50%;
font-size: 26px;
font-weight: bold;
cursor: pointer;
z-index: 9999;
box-shadow: 0 5px 15px rgba(0,0,0,0.3);
transition: 0.2s;
}
#helpButton:hover {
transform: scale(1.1);
background: #003366; /* Un bleu un peu plus foncé au survol */
}
/* Le reste du modal reste inchangé mais bien isolé */
#helpModal.help-modal-container {
display: none;
position: fixed;
z-index: 10000;
left: 0;
top: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.6);
backdrop-filter: blur(3px);
}
#helpModal .help-modal-content {
background: #fff;
margin: 12% auto;
padding: 30px;
border-radius: 15px;
width: 450px;
position: relative;
box-shadow: 0 15px 40px rgba(0,0,0,0.5);
font-family: sans-serif;
}
#helpModal .help-close-button {
position: absolute;
top: 15px;
right: 20px;
font-size: 30px;
cursor: pointer;
color: #888;
line-height: 1;
}
#helpModal .help-grid {
display: flex;
gap: 20px;
margin-top: 25px;
}
#helpModal .help-card {
flex: 1;
text-decoration: none;
color: #333;
padding: 20px;
border: 2px solid #f0f0f0;
border-radius: 10px;
text-align: center;
transition: 0.3s;
}
#helpModal .help-card:hover {
border-color: #004a99;
background: #f9fcff;
}
#helpModal .help-icon {
font-size: 35px;
display: block;
margin-bottom: 10px;
}
#helpModal .help-title {
color: #004a99;
margin: 0 0 10px 0;
font-size: 22px;
}
#helpModal .help-modal-footer {
margin-top: 25px;
padding-top: 15px;
border-top: 1px solid #eee;
text-align: center;
font-size: 12px;
color: #999;
}

View File

@ -47,6 +47,7 @@ class ControleurAjaxremplaceradherent extends Controleur
$this->adherent->initremplacementadherent($idPolice, $idAdherent, $dateSortie , $dateRemplacement, $user,
$motifavenant, $fraisCarte);
$remplacementadherent_temp = $this->adherent->getremplacementadherent_temp();
$spadherent = $this->adherent->getRapportSpAdherent($idAdherent, $dateSortie);
@ -61,6 +62,7 @@ class ControleurAjaxremplaceradherent extends Controleur
'adherentremplacanttemp' => $adherentremplacanttemp, 'naturepiece' => $this->naturepiece, 'sexe' => $this->sexe,
'pays' => $this->pays, 'situationfamille' => $this->situationfamille, 'groupesanguin' => $this->groupesanguin,
'remplacementadherent_temp' => $remplacementadherent_temp, 'garantieadherents' => $garantieadherents));
}
public function enregistrerremplacementadherent()
@ -77,7 +79,7 @@ class ControleurAjaxremplaceradherent extends Controleur
$adresseGeo = $this->requete->getParametreFormulaire("adresseGeo");
$adressePostale = $this->requete->getParametreFormulaire("adressePostale");
$codePays = $this->requete->getParametre("codePays");
$telephonFixe = $this->requete->getParametreFormulaire("telephonFixe");
$telephonFixe = ""; //$this->requete->getParametreFormulaire("telephonFixe");
$telephonePortable = $this->requete->getParametreFormulaire("telephonePortable");
$email = $this->requete->getParametreFormulaire("email");
$fraisCarte = $this->requete->getParametreFormulaire("fraisCarte","numerique");

View File

@ -1568,6 +1568,7 @@ function creer_avenant()
window.location.assign($("#racineWeb" ).val()+"Creeravenant/");
}
/*
function enregistrer_avenant()
{
codeTypeAvenant=$("#codeTypeAvenant").val();
@ -1593,13 +1594,6 @@ function enregistrer_avenant()
dt_effet = Math.round(Date.parse(d_effet)/(1000*3600*24));
dt_fin = Math.round(Date.parse(d_fin)/(1000*3600*24));
dt_avenant = Math.round(Date.parse(d_avenant)/(1000*3600*24));
/*
alert("dt_effet => "+dt_effet);
alert("dt_fin => "+dt_fin);
alert("dt_avenant => "+dt_avenant);
return;
*/
if (dt_avenant>dt_fin || dt_avenant<dt_effet)
{
@ -1653,7 +1647,94 @@ function enregistrer_avenant()
});
}
*/
function enregistrer_avenant() {
let codeTypeAvenant = $("#codeTypeAvenant").val();
// 1. Vérification si le type d'avenant est sélectionné
if (!codeTypeAvenant || codeTypeAvenant.trim() === "") {
let v_msg = "Veuillez sélectionner le type d'avenant !";
let v_msgEng = "Please select the type of amendment!";
alert_ebene(v_msg, v_msgEng);
return;
}
// 2. Préparation des dates pour comparaison
var d_effet = new Date($("#dateEffetSql").val());
var d_fin = new Date($("#dateFinSql").val());
var d_avenant = $("#dateAvenant").datepicker("getDate");
var d_aujourdhui = new Date();
// On retire les heures pour comparer uniquement les jours
d_aujourdhui.setHours(0, 0, 0, 0);
if (d_avenant) d_avenant.setHours(0, 0, 0, 0);
// Conversion en timestamps (jours)
dt_effet = Math.round(d_effet.getTime() / (1000 * 3600 * 24));
dt_fin = Math.round(d_fin.getTime() / (1000 * 3600 * 24));
dt_avenant = Math.round(d_avenant.getTime() / (1000 * 3600 * 24));
dt_aujourdhui = Math.round(d_aujourdhui.getTime() / (1000 * 3600 * 24));
// --- NOUVELLE RÈGLE : Restriction Incorporation/Retrait ---
// Remplacez 'INC' et 'RET' par vos codes réels issus de la DB
var codesRestrictifs = ['INC', 'RET', 'INCORPORATION', 'RETRAIT'];
if (codesRestrictifs.includes(codeTypeAvenant.toUpperCase())) {
if (dt_avenant < dt_aujourdhui) {
let v_msg = "Pour une incorporation ou un retrait, la date ne peut pas être antérieure à aujourd'hui.";
let v_msgEng = "For additions or removals, the date cannot be earlier than today.";
alert_ebene(v_msg, v_msgEng);
return; // Bloque l'exécution
}
}
// ---------------------------------------------------------
// 3. Vérification des bornes du contrat (déjà existant)
if (dt_avenant > dt_fin || dt_avenant < dt_effet) {
let v_msg = "Veuillez revoir la date ! Elle doit être comprise dans la période de validité du contrat.";
let v_msgEng = "Please review the date! It must be within the contract validity period.";
alert_ebene(v_msg, v_msgEng);
return;
}
// 4. Vérification du Motif
motifavenant=$("#motifavenant").val();
if ($("#motifavenant").val()<" ")
{
v_msg="Veuillez fournir le motif!";
v_msgEng="Please provide the reason";
alert_ebene(v_msg, v_msgEng);
return;
}
// 5. Confirmation de l'avenant
v_msg="Confirmez-vous cet avenant?";
v_msgEng="Do you confirm this amendment to the contract?";
confirm_ebene(v_msg, v_msgEng).then(isConfirmed => {
if (isConfirmed) {
var div_attente = $('#div_attente');
div_attente.html(`
<div class="d-flex flex-column align-items-center justify-content-center" style="padding-top:80px;">
<div class="spinner-border text-primary" role="status" style="width:3rem; height:3rem;">
<span class="visually-hidden">Loading...</span>
</div>
<span class="mt-3 fs-5 fw-bold">
Veuillez patienter... / Please wait...
</span>
</div>
`);
document.getElementById("formAvenant").submit();
}
});
}
function pop_afficher_selection_retrait() {
const div_selection_assure = $('#div_selection_assure');
@ -1805,6 +1886,7 @@ function liste_avenant()
window.location.assign($("#racineWeb" ).val()+"Listeavenant/");
}
/*
function controle_date_avenant() {
let codeTypeAvenant = $("#codeTypeAvenant").val();
$("#div_periodidite").html("");
@ -1812,6 +1894,20 @@ function controle_date_avenant() {
//$("#dateAvenant").prop("readonly", true);
//$("#motifavenant").prop("readonly", true);
}
*/
function controle_date_avenant() {
let codeTypeAvenant = $("#codeTypeAvenant").val();
let codesRestrictifs = ['INC', 'RET', 'INCORPORATION', 'RETRAIT'];
if (codesRestrictifs.includes(codeTypeAvenant.toUpperCase())) {
// Restreindre le calendrier à partir d'aujourd'hui
$("#dateAvenant").datepicker("option", "minDate", 0);
} else {
// Autoriser les dates passées (selon les bornes du contrat)
$("#dateAvenant").datepicker("option", "minDate", null);
}
}
function init_import_assures()
{
@ -6446,7 +6542,7 @@ function init_remplacement_adherent()
dt11=Math.round(Date.parse(td11)/(1000*3600*24));
dt2=Math.round(Date.parse(td2)/(1000*3600*24));
if (td11<=td1)
if (td11<td1)
{
v_msg="Attention! Veuillez revoir vos dates!";
v_msgEng="Warning! Please review your dates!";
@ -6716,6 +6812,7 @@ function enregistrer_remplacement_adherent()
},
complete: function()
{
v_msg="Opération effectuée avec succès!";
v_msgEng="Operation successfully completed";
@ -6723,6 +6820,7 @@ function enregistrer_remplacement_adherent()
// Ce code ne sexécute quaprès clic sur OK
consulter_remplacement_adherent();
});
}
});
}

View File

@ -541,6 +541,11 @@ class Adherent extends Modele {
$motifavenant, $fraisCarte)
{
$sql = 'call sp_init_remplacement_adherent(?, ?, ?, ?, ?, ?, ?)';
/*var_dump(array($idPolice, $idAdherent, $dateSortie , $dateRemplacement, $user, $motifavenant, $fraisCarte));
die();*/
$this->executerRequete($sql, array($idPolice, $idAdherent, $dateSortie , $dateRemplacement, $user, $motifavenant, $fraisCarte));
}
@ -592,6 +597,13 @@ class Adherent extends Modele {
$sql = 'call sp_enregistrer_remplacement_adherent(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
/*
var_dump(array($idPolice, $idAdherent, $user, $nom, $prenoms, $codeNaturePiece, $numeroPiece,
$sexe, $dateNaissance, $codeGroupeSanguin, $codeSituationFamille, $nombreEnfants, $adresseGeo, $adressePostale,
$codePays, $telephonFixe, $telephonePortable, $email, $fraisCarte));
die();
*/
$this->executerRequete($sql, array($idPolice, $idAdherent, $user, $nom, $prenoms, $codeNaturePiece, $numeroPiece,
$sexe, $dateNaissance, $codeGroupeSanguin, $codeSituationFamille, $nombreEnfants, $adresseGeo, $adressePostale,
$codePays, $telephonFixe, $telephonePortable, $email, $fraisCarte));

View File

@ -15,6 +15,34 @@
<label class="small text-muted d-block"><?= _("Motif renseigné") ?></label>
<div class="text-truncate italic">" <?= $this->nettoyer($remplacementadherent_temp['motif']) ?> "</div>
</div>
<div class="col-md-3">
<label class="small text-muted d-block"><?= _("Durée Initiale") ?></label>
<div class="fw-bold text-secondary">
<?= number_format($remplacementadherent_temp['dureInitiale'], 0, ',', ' ') ?>
</div>
</div>
<div class="col-md-3">
<label class="small text-muted d-block"><?= _("Prime Nette") ?></label>
<div class="fw-bold text-secondary">
<?= number_format($remplacementadherent_temp['primeDuSortant'], 0, ',', ' ') ?>
</div>
</div>
<div class="col-md-3">
<label class="small text-muted d-block"><?= _("Durée non acquise") ?></label>
<div class="fw-bold text-danger">
<?= number_format($remplacementadherent_temp['dureeNonAcquise'], 0, ',', ' ') ?>
</div>
</div>
<div class="col-md-3">
<label class="small text-muted d-block"><?= _("Prime non acquise") ?></label>
<div class="fw-bold text-danger">
<?= number_format($remplacementadherent_temp['primeNonAcquise'], 0, ',', ' ') ?>
</div>
</div>
</div>
</div>
</div>
@ -154,11 +182,27 @@
</div>
<div class="col-md-4">
<label class="form-label small fw-bold text-uppercase">
<label class="form-label fw-bold small text-uppercase">
<?= _("Téléphone Portable") ?><span class="required-star">*</span>
</label>
<input class="form-control" type="tel" id="telephonePortable" name="telephonePortable" value="<?= $_SESSION['indicatifTelephone'] ?>" required>
<div class="input-group">
<span class="input-group-text bg-white text-muted"><i class="fas fa-mobile-alt"></i></span>
<input type="tel"
class="form-control"
id="telephonePortable"
name="telephonePortable"
placeholder="Ex: 250700000001"
required
pattern="^250[0-9]{9,}$"
title="<?= est_anglophone() ? "The number must start with 250 and contain at least 12 digits." : "Le numéro doit commencer par 250 et comporter au moins 12 chiffres.";?>"
oninput="this.setCustomValidity('')"
oninvalid="this.setCustomValidity('<?= est_anglophone() ? 'The number must mandatorily start with 250 and contain at least 12 digits in total.' : 'Le numéro doit obligatoirement commencer par 250 et contenir au moins 12 chiffres au total.';?>')">
</div>
<div class="form-text text-muted small">
<i class="fas fa-info-circle"></i> <?= est_anglophone() ? 'Required format: 250XXXXXXXXX (min. 12 digits)' : 'Format requis : 250XXXXXXXXX (min. 12 chiffres)'; ?>
</div>
</div>
<div class="col-md-4">
<label class="form-label small fw-bold text-uppercase"><?= _("E-mail") ?></label>
<input class="form-control" type="email" id="email" name="email" placeholder="exemple@mail.com">
@ -181,4 +225,16 @@
</div>
</div>
</div>
</div>
</div>
<script>
document.getElementById('telephonePortable').addEventListener('input', function (e) {
const pattern = /^250[0-9]{9,}$/;
if (pattern.test(this.value)) {
this.classList.remove('is-invalid');
this.classList.add('is-valid');
} else {
this.classList.remove('is-valid');
this.classList.add('is-invalid');
}
});
</script>

View File

@ -169,9 +169,22 @@
</label>
<div class="input-group">
<span class="input-group-text bg-white text-muted"><i class="fas fa-mobile-alt"></i></span>
<input type="tel" class="form-control" id="telephonePortable" name="telephonePortable" required minlength="12">
<input type="tel"
class="form-control"
id="telephonePortable"
name="telephonePortable"
placeholder="Ex: 250700000001"
required
pattern="^250[0-9]{9,}$"
title="<?= est_anglophone() ? "The number must start with 250 and contain at least 12 digits." : "Le numéro doit commencer par 250 et comporter au moins 12 chiffres.";?>"
oninput="this.setCustomValidity('')"
oninvalid="this.setCustomValidity('<?= est_anglophone() ? 'The number must mandatorily start with 250 and contain at least 12 digits in total.' : 'Le numéro doit obligatoirement commencer par 250 et contenir au moins 12 chiffres au total.';?>')">
</div>
<div class="form-text text-muted small">
<i class="fas fa-info-circle"></i> <?= est_anglophone() ? 'Required format: 250XXXXXXXXX (min. 12 digits)' : 'Format requis : 250XXXXXXXXX (min. 12 chiffres)'; ?>
</div>
</div>
<div class="col-md-6">
<label class="form-label fw-bold small text-uppercase"><?= _("Téléphone Fixe") ?></label>
<input type="tel" class="form-control" id="telephonFixe" name="telephonFixe">
@ -236,4 +249,16 @@
</div>
</div>
<?php endif; ?>
</div>
</div>
<script>
document.getElementById('telephonePortable').addEventListener('input', function (e) {
const pattern = /^250[0-9]{9,}$/;
if (pattern.test(this.value)) {
this.classList.remove('is-invalid');
this.classList.add('is-valid');
} else {
this.classList.remove('is-valid');
this.classList.add('is-invalid');
}
});
</script>

View File

@ -94,7 +94,7 @@
<div class="col-12">
<label for="motifavenant" class="form-label fw-bold text-uppercase"><?= _("Motif / Commentaires") ?></label>
<textarea class="form-control shadow-sm" id="motifavenant" name="motifavenant" rows="2" placeholder="<?= _("Précisez l'objet de cet avenant...") ?>"></textarea>
<textarea class="form-control shadow-sm" id="motifavenant" name="motifavenant" rows="2" placeholder="<?= _("Précisez l'objet de cet avenant...") ?>" required></textarea>
</div>
<div class="col-12 mt-4">

View File

@ -51,6 +51,7 @@
<?= dateLang($this->nettoyer($adherent['dateFinPolice']), $_SESSION['lang']) ?>
</div>
</div>
<div class="col-md-2 text-center">
<label class="form-label small text-uppercase mb-0 fw-bold"><?= _("Consommation") ?></label>
<div class="p-2 border rounded bg-white small text-danger fw-bold">
@ -92,7 +93,7 @@
</div>
<div class="col-md-8">
<label class="form-label fw-bold small text-uppercase"><?= _("Motif de l'avenant (Observation)") ?></label>
<label class="form-label fw-bold small text-uppercase"><?= _("Motif de l'avenant (Observation)") ?> <span class="text-danger">*</span></label>
<textarea class="form-control" id="motifavenant" name="motifavenant" rows="1" placeholder="<?= _("Ex: Remplacement suite à démission...") ?>"></textarea>
</div>

View File

@ -127,8 +127,9 @@ $photoAssureCrypte = $_SESSION['photoAssureCrypte'];
<!-- 4. VOS STYLES PERSONNALISÉS (en dernier pour qu'ils dominent) -->
<link href="<?= $racineWeb ?>Bootstrap_new/css/style_office.css?ver=2026.02.05.00" rel="stylesheet">
<link href="<?= $racineWeb ?>Bootstrap_new/css/help-center.css?ver=2026.02.18.01" rel="stylesheet">
<link href="<?= $racineWeb ?>Bootstrap_new/css/ux_enhancements.css?ver=2025.12.21.02" rel="stylesheet">
<!-- Charts -->
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2.0.0"></script>
@ -237,26 +238,24 @@ $photoAssureCrypte = $_SESSION['photoAssureCrypte'];
</div>
<?php endif; ?>
<!-- -->
<i class="bi bi-list toggle-sidebar-btn" onclick="toggleSidebar()" style="cursor: pointer;"></i>
<i class="bi bi-list toggle-sidebar-btn me-2" onclick="toggleSidebar()" style="cursor: pointer;"></i>
</div>
<nav aria-label="breadcrumb" class="mt-4">
<ol class="breadcrumb shadow-sm bg-white p-2 px-3">
<li class="breadcrumb-item small"><a href="<?= $retourVue;?>" class="text-decoration-none text-muted text-uppercase"><?= $titreRetour ?></a></li>
<li class="breadcrumb-item small">
<a href="<?= $retourVue;?>" class="text-decoration-none text-muted text-uppercase">
<i class="fas fa-arrow-left text-muted"></i>
<?= $titreRetour ?>
</a>
</li>
<li class="breadcrumb-item small text-primary fw-bold active text-uppercase"><?= $descriptionVue ?></li>
</ol>
</nav>
<div class="header-controls">
<!-- Notifications
<button class="header-btn notification-btn" onclick="appNotifications().showMessagesModal()"
aria-label="Notifications" title="<?= _('Voir les notifications') ?>">
<i class="bi bi-bell"></i>
<span class="notification-badge" id="notificationCount" aria-live="polite">0</span>
</button>
-->
<!-- Logo Assureur -->
<div id="lienlogo">
<img src="<?= $_SESSION['lienLogo'] ?>" alt="Logo Assureur">
@ -620,28 +619,54 @@ $photoAssureCrypte = $_SESSION['photoAssureCrypte'];
</div>
</div>
<!--<button class="d-none" id="btn_police" data-bs-toggle="modal" data-bs-target="#pop_police"></button>-->
<!-- Polices Modal -->
<div class="modal fade" id="pop_police" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-bs-dismiss="modal"> <?= _("Fermer") ?> </button>
<h4 class="modal-title"> <?= _("Sélectionner une police") ?> </h4>
</div>
<!-- Help Modal -->
<button id="helpButton" title="<?php echo est_anglophone() ? 'Help' : 'Aide'; ?>">?</button>
<div class="modal-body">
<div id="div_police">
</div>
<div id="helpModal" class="help-modal-container">
<div class="help-modal-content">
<span class="help-close-button">&times;</span>
<?php if (est_anglophone()): ?>
<div id="helpContentEN" class="help-lang-section">
<h2 class="help-title">Help Center</h2>
<p class="help-subtitle">How to use your documentation?</p>
<div class="help-grid">
<a href="<?= $racineWeb ?>Docs/Docs/Quick-Start-EN.pdf" target="_blank" class="help-card">
<span class="help-icon">🚀</span>
<strong class="help-card-title">Quick Start Guide</strong>
<small class="help-card-info">Essentials in 15 pages</small>
</a>
<a href="<?= $racineWeb ?>Docs/Docs/User-Manual-EN.pdf" target="_blank" class="help-card">
<span class="help-icon">📖</span>
<strong class="help-card-title">Full User Manual</strong>
<small class="help-card-info">Technical details (61 pages)</small>
</a>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-bs-dismiss="modal"> <?= _("Fermer") ?> </button>
</div>
<?php else: ?>
<div id="helpContentFR" class="help-lang-section">
<h2 class="help-title">Centre d'Aide</h2>
<p class="help-subtitle">Comment utiliser votre documentation ?</p>
<div class="help-grid">
<a href="<?= $racineWeb ?>Docs/Docs/Guide-Demarrage-FR.pdf" target="_blank" class="help-card">
<span class="help-icon">🚀</span>
<strong class="help-card-title">Guide de démarrage</strong>
<small class="help-card-info">L'essentiel en 15 pages</small>
</a>
<a href="<?= $racineWeb ?>Docs/Docs/Manuel-Utilisateur-FR.pdf" target="_blank" class="help-card">
<span class="help-icon">📖</span>
<strong class="help-card-title">Manuel Complet</strong>
<small class="help-card-info">Détails techniques (63 pages)</small>
</a>
</div>
</div>
</div>
</div>
</div>
<?php endif; ?>
<div class="help-modal-footer">
<p><?php echo est_anglophone() ? 'Contact Support' : 'Contact Support'; ?>: info@ebene.info</p>
</div>
</div>
</div>
<div id="div_ajaxgabarit">
</div>
@ -824,10 +849,10 @@ $photoAssureCrypte = $_SESSION['photoAssureCrypte'];
/* ================================
4) Dropdown utilisateur
================================= */
const btn = document.getElementById('userDropdownBtn');
if (btn) {
const dropdown = new bootstrap.Dropdown(btn);
btn.addEventListener('click', function(e) {
const btnDropdown = document.getElementById('userDropdownBtn');
if (btnDropdown) {
const dropdown = new bootstrap.Dropdown(btnDropdown);
btnDropdown.addEventListener('click', function(e) {
e.preventDefault();
e.stopPropagation();
dropdown.toggle();
@ -835,9 +860,9 @@ $photoAssureCrypte = $_SESSION['photoAssureCrypte'];
}
document.addEventListener('click', function(e) {
const btn = document.getElementById('userDropdownBtn');
if (btn && !btn.contains(e.target)) {
const instance = bootstrap.Dropdown.getInstance(btn);
const btnDropdown = document.getElementById('userDropdownBtn');
if (btnDropdown && !btnDropdown.contains(e.target)) {
const instance = bootstrap.Dropdown.getInstance(btnDropdown);
if (instance) instance.hide();
}
});
@ -852,6 +877,31 @@ $photoAssureCrypte = $_SESSION['photoAssureCrypte'];
}
});
/* ================================
6) Gestion du Centre d'Aide (Spécifique)
================================= */
const helpModal = document.getElementById("helpModal");
const helpBtn = document.getElementById("helpButton");
const helpClose = document.querySelector(".help-close-button");
if (helpBtn && helpModal) {
helpBtn.addEventListener('click', function() {
helpModal.style.display = "block";
});
if (helpClose) {
helpClose.addEventListener('click', function() {
helpModal.style.display = "none";
});
}
window.addEventListener('click', function(event) {
if (event.target == helpModal) {
helpModal.style.display = "none";
}
});
}
});
</script>
</body>