radiantrh/Vue/gabarit.php
2026-01-20 15:18:15 +00:00

854 lines
41 KiB
PHP
Executable File

<?php
require_once 'gabarit_queries.php';
$gabary = new Gabary();
$_SESSION['firstLevelMenu'] = '';
$current_url = $_SERVER['REQUEST_URI'];
$elements = explode("/", $current_url);
$activeLink = $elements[1] ?? '';
$_SESSION['firstLevelMenu'] = $activeLink;
$companyDisplayName = htmlspecialchars($_SESSION['nomSociete'], ENT_QUOTES);
$imgData = $_SESSION['photoAssureCrypte'] ?? '';
// ============================================
// FONCTION DE DÉTECTION - À METTRE EN HAUT DU FICHIER
// ============================================
/**
* Détecte le menu actif de manière fiable
* @param string $activeLink Lien de la page active (ex: "Accueil")
* @param array $menus Liste des menus parents
* @param object $gabary Instance Gabary pour récupérer les enfants
* @return array ['parent' => string, 'child' => string|null]
*/
if (!function_exists('detectActiveMenu')) {
function detectActiveMenu($activeLink, $menus, $gabary) {
// LOG SIMPLIFIÉE ET FIABLE :
// 1. ACCUEIL = TOUJOURS menu 0 (priorité absolue)
if ($activeLink == 'Accueil') {
return ['parent' => '0', 'child' => null];
}
// 2. Recherche dans les autres menus
foreach ($menus as $key0 => $menuParent) {
$menuChildren = $gabary->get_menus_by_parent_code($menuParent['vue']);
// Vérifier chaque enfant
foreach ($menuChildren as $key1 => $menuChild) {
$childLink = explode('/', $menuChild['lienMenu'])[0] ?? '';
if ($childLink == $activeLink) {
return ['parent' => (string)$key0, 'child' => (string)$key1];
}
}
}
// 3. Fallback : premier menu
return ['parent' => '0', 'child' => null];
}
}
// ============================================
// UTILISATION - REMPLACE VOTRE CODE ACTUEL
// ============================================
$menuData = detectActiveMenu($activeLink, $menus, $gabary);
$activeParentId = $menuData['parent'];
$activeChildId = $menuData['child'];
$imgData = $_SESSION['photoAssureCrypte'];
$photoAssureCrypte = $_SESSION['photoAssureCrypte'];
?>
<!DOCTYPE html>
<html lang="fr" data-bs-theme="light">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<base href="<?= $racineWeb ?>">
<title><?= htmlspecialchars($_SESSION['vue'] ?? 'INTER-SANTE') ?> | Portail Santé</title>
<!-- Meta pour UX améliorée -->
<meta name="description" content="Portail RH de gestion santé - INTER-SANTE">
<meta name="theme-color" content="#b7472a">
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="apple-mobile-web-app-title" content="INTER-SANTE">
<!-- Icône -->
<link rel="apple-touch-icon" href="<?= $racineWeb ?>Bootstrap_new/images/new/favicon.png">
<link rel="icon" href="<?= $racineWeb ?>Bootstrap_new/images/new/favicon.png" type="image/png">
<!-- ============================================
ORDRE CRITIQUE : CSS
============================================ -->
<!-- 1. BOOTSTRAP 5 (DOIT ÊTRE EN PREMIER) -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN"
crossorigin="anonymous">
<!-- 2. OVERRIDE BOOTSTRAP (DOIT ÊTRE IMMÉDIATEMENT APRÈS) -->
<link href="<?= $racineWeb ?>Bootstrap_new/css/override.css?ver=2025.12.21.01" rel="stylesheet">
<!-- 3. AUTRES CDN (après l'override) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.1/font/bootstrap-icons.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
<!-- Select2 -->
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/select2-bootstrap-5-theme@1.3.0/dist/select2-bootstrap-5-theme.min.css" rel="stylesheet">
<!-- DataTables -->
<link href="https://cdn.datatables.net/v/bs5/jq-3.7.0/dt-2.0.3/datatables.min.css" rel="stylesheet">
<!-- DataTables Buttons CSS -->
<link rel="stylesheet" href="https://cdn.datatables.net/buttons/2.4.2/css/buttons.bootstrap5.min.css">
<!-- SweetAlert2 -->
<link href="https://cdn.jsdelivr.net/npm/sweetalert2@11.10.5/dist/sweetalert2.min.css" rel="stylesheet">
<!-- Animate.css -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css">
<!-- jQuery UI -->
<link rel="stylesheet" href="https://code.jquery.com/ui/1.13.2/themes/base/jquery-ui.css">
<!-- Progressive Web App -->
<link rel="manifest" href="<?= $racineWeb ?>manifest.json">
<!-- 4. VOS STYLES PERSONNALISÉS (en dernier pour qu'ils dominent) -->
<link href="<?= $racineWeb ?>Bootstrap_new/css/style_office.css?ver=2026.01.20.04" 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>
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-annotation@1.0.2"></script>
<!-- jsPDF -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
<!-- ============================================
SCRIPTS ET CONFIGURATION
============================================ -->
<script>
// Mode développeur
//const modeDev = <?= $_SESSION['modeDev_C'] ?? 0 ?>;
const modeDev = 1;
if (modeDev !== 1) {
document.addEventListener('contextmenu', e => e.preventDefault());
}
<?php
// Assurez-vous que $activeParentId est correct pour Accueil
if ($activeLink == 'Accueil' && ($activeParentId ?? '') != '0') {
echo "console.warn('PHP: Correction activeParentId pour Accueil');\n";
$activeParentId = '0';
$activeChildId = null;
}
?>
// Variables globales
window.appConfig = {
activeParentId: '<?= $activeParentId ?? "0" ?>',
activeChildId: '<?= $activeChildId ?? "" ?>',
activeLink: '<?= $activeLink ?>',
racineWeb: '<?= $racineWeb ?>',
baseUrl: '<?= $racineWeb ?>',
isAnglophone: <?= est_anglophone() ? 'true' : 'false' ?>,
modeTest: <?= $_SESSION['bdTests_C'] == "1" ? 'true' : 'false' ?>,
userInitials: '<?= $_SESSION['userInitials_C'] ?? 'U' ?>',
// Debug info
debugMode: true,
cssOverride: true
};
// Vérification
// Debug CSS loading
// Vérifier le chargement CSS
document.addEventListener('DOMContentLoaded', function() {
setTimeout(function() {
const overrideLoaded = Array.from(document.styleSheets).some(sheet =>
sheet.href && sheet.href.includes('override.css')
);
if (!overrideLoaded) {
// Charger dynamiquement
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = window.appConfig.baseUrl + 'Bootstrap_new/css/override.css?nocache=' + Date.now();
document.head.appendChild(link);
}
}, 100);
});
</script>
<!-- Open Graph pour le partage -->
<meta property="og:title" content="INTER-SANTE Portail RH">
<meta property="og:description" content="Portail professionnel de gestion santé">
<meta property="og:image" content="<?= $racineWeb ?>Bootstrap_new/images/new/favicon.png">
<meta property="og:url" content="<?= $racineWeb ?>">
<meta property="og:type" content="website">
<!-- Twitter Cards -->
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="INTER-SANTE Portail RH">
<meta name="twitter:description" content="Portail RH de gestion santé">
<meta name="twitter:image" content="<?= $racineWeb ?>Bootstrap_new/images/new/favicon.png">
</head>
<body>
<!-- Header -->
<header class="app-header">
<div class="header-content">
<div class="logo-container">
<a href="Accueil" class="app-logo">
<img src="/Bootstrap_new/images/new/favicon.png" alt="INTER-SANTE" width="36" height="36">
<span class="ms-2">INTER-SANTE</span>
</a>
<?php if($_SESSION['bdTests_C'] == "1"): ?>
<div class="test-indicator" role="status" aria-label="Mode test activé">
<i class="fas fa-flask"></i>
<span>MODE TEST</span>
</div>
<?php endif; ?>
<i class="bi bi-list toggle-sidebar-btn" onclick="toggleSidebar()" style="cursor: pointer;"></i>
</div>
<!-- -->
<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">
<span > <?=$companyDisplayName?> </span>
</div>
<!-- Language Selector -->
<div class="language-selector" onclick="javascript:changer_langue();"
role="button" tabindex="0"
aria-label="<?= _('Changer de langue') ?>">
<?php
$flag = est_anglophone() ? 'england.png' : 'france.png';
$lib = est_anglophone() ? 'EN' : 'FR';
?>
<img src="/Bootstrap_new/images/<?= $flag ?>" alt="<?= $lib ?>" class="language-flag" width="24" height="16">
<span><?= $lib ?></span>
</div>
<!-- User Menu -->
<div class="dropdown">
<button id="userDropdownBtn"
class="user-menu dropdown-toggle border-0 bg-transparent p-0"
type="button"
data-bs-toggle="dropdown"
aria-expanded="false">
<div class="user-avatar">
<?= $_SESSION['userInitials_C'] ?? 'U' ?>
</div>
<div class="user-info text-start ms-0">
<div class="user-name fw-bold" style="line-height: 1.2;">
<?= $_SESSION['utilisateur_C'] ?? _('Utilisateur') ?>
</div>
<div class="user-role text-primary text-bold">
<?= $_SESSION['nomClient_C'] ?? _('Client') ?>
</div>
</div>
<i class="bi bi-chevron-down ms-0 user-arrow"></i>
</button>
<ul class="dropdown-menu dropdown-menu-end shadow-sm">
<li class="dropdown-header">
<div class="user-avatar mx-auto mb-2">
<?= $_SESSION['userInitials_C'] ?? 'U' ?>
</div>
<div class="text-center">
<div class="fw-bold text-dark"><?= $_SESSION['utilisateur_C'] ?? _('Utilisateur') ?></div>
<small class="text-muted"><?= $_SESSION['nomClient_C'] ?? _('Client') ?></small>
</div>
</li>
<li>
<a class="dropdown-item" href="javascript:change_password()">
<i class="fas fa-user-circle me-2"></i> <?= _('Changer le mot de passe') ?>
</a>
</li>
<li>
<a class="dropdown-item text-danger" href="Connexion/deconnecter">
<i class="fas fa-sign-out-alt me-2"></i> <?= _('Déconnexion') ?>
</a>
</li>
</ul>
</div>
</div>
</div>
</header>
<!-- Navigation principale -->
<aside class="app-sidebar" id="sidebar">
<nav class="sidebar-nav" aria-label="Navigation principale">
<div class="nav-section">
<?php foreach ($menus as $key0 => $menuParent):
$menuChildrenLevelOne = $gabary->get_menus_by_parent_code($menuParent['vue']);
$hasActiveChild = false;
// 1. On nettoie l'URL active (on enlève les slashs inutiles)
$currentActive = trim($activeLink, '/');
// 2. On ne compare QUE si on a vraiment une page active
if (!empty($currentActive)) {
foreach ($menuChildrenLevelOne as $key1 => $menuChild) {
// On extrait le lien du menu et on le nettoie
$childLink = trim($menuChild['lienMenu'], '/');
// On compare de manière stricte
if ($childLink === $currentActive) {
$hasActiveChild = true;
break;
}
}
}
// 3. Le menu s'ouvre SEULEMENT si un enfant est actif
$shouldBeOpen = false;
?>
<div class="nav-item">
<?php if (count($menuChildrenLevelOne) > 0): ?>
<a href="javascript:void(0)"
class="nav-link <?= $shouldBeOpen ? 'active' : '' ?>"
data-submenu-target="submenu<?= $key0 ?>"
aria-expanded="<?= $shouldBeOpen ? 'true' : 'false' ?>"
aria-controls="submenu<?= $key0 ?>"
data-label="<?= htmlspecialchars($menuParent['libeleMenu']) ?>">
<i class="<?= $menuParent['icone'] ?>"></i>
<span class="nav-text"><?= $menuParent['libeleMenu'] ?></span>
<i class="nav-arrow bi bi-chevron-right"></i>
</a>
<div class="nav-submenu collapse <?= $shouldBeOpen ? 'show' : '' ?>"
id="submenu<?= $key0 ?>"
data-bs-parent=".nav-section">
<?php foreach ($menuChildrenLevelOne as $key1 => $menuChild):
$childActive = (explode('/', $menuChild['lienMenu'])[0] ?? '') == $activeLink;
?>
<a href="<?= $menuChild['lienMenu'] ?>"
class="nav-link <?= $childActive ? 'active' : '' ?>"
aria-current="<?= $childActive ? 'page' : 'false' ?>"
data-label="<?= htmlspecialchars($menuChild['libeleMenu']) ?>">
<?= $menuChild['libeleMenu'] ?>
</a>
<?php endforeach; ?>
</div>
<?php else: ?>
<a href="<?= $menuParent['lienMenu'] ?>"
class="nav-link <?= ((explode('/', $menuParent['lienMenu'])[0] ?? '') == $activeLink) ? 'active' : '' ?>"
data-label="<?= htmlspecialchars($menuParent['libeleMenu']) ?>">
<i class="<?= $menuParent['icone'] ?>"></i>
<span class="nav-text"><?= $menuParent['libeleMenu'] ?></span>
</a>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>
</nav>
</aside>
<!-- Main Content -->
<main class="app-main" id="mainContent">
<INPUT class="sr-only" TYPE="text" id="vue" name="vue" value="<?= isset($_SESSION['vue']) ? $_SESSION['vue'] : ""; ?>">
<input class="sr-only" type="text" id="codeSociete" name="codeSociete" value="<?= $_SESSION['codeSociete'] ?>">
<!-- Navigation Tabs -->
<div class="content-area">
<?php if(!empty($menusvue)): ?>
<div class="nav-bar">
<div class="nav-tabs" role="tablist" aria-label="Navigation secondaire">
<?php foreach ($menusvue as $menu):
$isActive = ($_SESSION['vue'] ?? '') == $menu['libeleMenu'];
?>
<a href="<?= $menu['lienMenu'] ?>"
class="nav-tab <?= $isActive ? 'active' : '' ?>"
title="<?= $menu['descriptionMenu'] ?? '' ?>"
role="tab"
aria-selected="<?= $isActive ? 'true' : 'false' ?>"
<?= $isActive ? 'aria-current="page"' : '' ?>>
<i class="<?= $menu['icone'] ?? 'bi bi-arrow-left-circle' ?>"></i>
<?= $menu['libeleMenu'] ?>
</a>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
<!-- Hidden Inputs -->
<input type="hidden" id="racineWeb" value="<?= $racineWeb ?>">
<input type="hidden" id="dureeSession" value="<?= $_SESSION['dureeSession'] ?>">
<input type="hidden" id="nomSociete" value="<?= $_SESSION['nomSociete'] ?>">
<input type="hidden" id="nomClient" value="<?= htmlspecialchars($_SESSION['nomClient_C']) ?>">
<input type="hidden" id="idBeneficiaire_C" value="<?= $_SESSION['idBeneficiaire_C'] ?>">
<input type="hidden" id="okId" value="<?= $_SESSION['okId'] ?>">
<!-- Content Container -->
<div class="content-card">
<div class="card-body">
<div id="contenu">
<div id="div_test_gabarit"></div>
<?= $contenu ?>
</div>
</div>
</div>
</div>
</main>
<!-- Context Panel -->
<aside class="context-panel" id="contextPanel" aria-label="Panneau de contexte">
<div class="context-header">
<div class="context-title">
<i class="bi bi-info-circle"></i>
<span><?= _('Contexte de la session') ?></span>
</div>
<button class="context-close" onclick="appUX.toggleContextPanel()" aria-label="Fermer le panneau de contexte">
<i class="bi bi-x-lg"></i>
</button>
</div>
<div class="context-body">
<!-- Souscripteur -->
<div class="context-section">
<div class="section-title">
<i class="fas fa-building-user"></i>
<span><?= _('Client') ?></span>
</div>
<div class="info-box">
<div class="info-value">
<?= $this->nettoyer($_SESSION['nomClient_C']) ?>
</div>
</div>
</div>
<!-- Police -->
<div class="context-section">
<div class="section-title">
<i class="bi bi-file-earmark-text"></i>
<span><?= _('Police') ?></span>
</div>
<div class="info-box">
<div class="info-value">
<?= $this->nettoyer($_SESSION['numeroPolice_C']) ?>
</div>
</div>
</div>
<!-- Adhérent principal -->
<div class="context-section">
<div class="section-title">
<i class="bi bi-person-badge"></i>
<span><?= _('Assuré principal') ?></span>
</div>
<div class="info-box">
<div class="info-value">
<?= $this->nettoyer($_SESSION['adherent_C']) ?>
</div>
</div>
</div>
<!-- Patient -->
<div class="context-section">
<div class="section-title">
<i class="bi bi-person-heart"></i>
<span><?= _('Bénéficiaire') ?></span>
</div>
<button class="action-btn" onclick="afficher_beneficiaire_id()" aria-label="Voir les détails du bénéficiaire">
<i class="bi bi-person"></i>
<span><?= _('Bénéficiaire').' : '.$this->nettoyer($_SESSION['numeroBeneficiaire_C']) ?></span>
</button>
<div class="info-box">
<div class="info-value">
<?= $this->nettoyer($_SESSION['beneficiaire_C']) ?>
</div>
</div>
</div>
<!-- Photo patient -->
<?php if ($_SESSION['faceRegistered_C'] == "1" && ($_SESSION['idBeneficiaire_C'] ?? 0) > 0): ?>
<div class="context-section">
<div class="section-title">
<i class="bi bi-camera"></i>
<span><?= _('Photo du bénéficiaire') ?></span>
</div>
<div class="photo-container">
<img src="<?=$photoAssureCrypte?>"
class="patient-photo"
data-bs-toggle="modal"
data-bs-target="#pop_photo"
alt="<?= _('Photo du bénéficiaire') ?>"
loading="lazy">
</div>
</div>
<?php endif; ?>
<!-- Actions -->
<div class="context-section">
<div class="section-title">
<i class="bi bi-lightning"></i>
<span><?= _('Actions rapides') ?></span>
</div>
<!--
<button class="action-btn" onclick="appNotifications.showMessagesModal()" aria-label="Gérer les notifications">
<i class="bi bi-chat-dots"></i>
<span><?= _('Gérer les notifications') ?></span>
</button>
-->
<button class="action-btn" onclick="change_password()" aria-label="Changer le mot de passe">
<i class="bi bi-key"></i>
<span><?= _('Changer le mot de passe') ?></span>
</button>
</div>
<!-- Messages -->
<div id="nbMessagesNonLus" class="d-none">
<input type="hidden" id="msgNonLus" value="0">
</div>
</div>
</aside>
<!-- Zone de détection de proximité -->
<div class="proximity-hover-area" aria-hidden="true"></div>
<!-- Bouton contexte style QuillBot -->
<button class="context-toggle" onclick="appUX.toggleContextPanel()"
aria-label="Afficher/Masquer le panneau de contexte"
aria-expanded="false"
aria-controls="contextPanel">
<i class="bi bi-info-circle"></i>
</button>
<!-- Modals -->
<!-- Photo Modal -->
<div class="modal fade modal-office" id="photoModal" tabindex="-1"
aria-labelledby="photoModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="photoModalLabel"><?= _('Photo du bénéficiaire') ?></h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Fermer"></button>
</div>
<div class="modal-body text-center">
<?php if ($_SESSION['faceRegistered_C'] == "1"): ?>
<img src="<?=$photoAssureCrypte?>"
class="img-fluid rounded"
style="max-height: 70vh; max-width: 100%;"
alt="<?= _('Photo agrandie du bénéficiaire') ?>">
<?php endif; ?>
</div>
</div>
</div>
</div>
<!-- Messages Modal -->
<div class="modal fade modal-office" id="messagesModal" tabindex="-1"
aria-labelledby="messagesModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="messagesModalLabel"><?= _('Notifications non lues') ?></h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Fermer"></button>
</div>
<div class="modal-body">
<div id="div_messagerie"></div>
</div>
</div>
</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>
<div class="modal-body">
<div id="div_police">
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-bs-dismiss="modal"> <?= _("Fermer") ?> </button>
</div>
</div>
</div>
</div>
<div id="div_ajaxgabarit">
</div>
<div class="modal fade" id="pop_photo" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button id="btn_close_pop" name="btn_close_pop" type="button" class="close" data-bs-dismiss="modal"> <?= _("Fermer") ?> </button>
<h4 class="modal-title"> <?= _("Photo") ?> </h4>
</div>
<div class="modal-body">
<img src="<?=$photoAssureCrypte?>" style="width: 450px;" >
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-bs-dismiss="modal"> <?= _("Fermer") ?> </button>
</div>
</div>
</div>
</div>
<!-- JavaScript Libraries -->
<script src="https://code.jquery.com/jquery-3.7.0.min.js"></script>
<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/i18n/jquery-ui-i18n.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.datatables.net/v/bs5/dt-1.13.6/datatables.min.js"></script>
<!-- JS Buttons + dépendances -->
<script src="https://cdn.datatables.net/buttons/2.4.2/js/dataTables.buttons.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.4.2/js/buttons.bootstrap5.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.4.2/js/buttons.html5.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.4.2/js/buttons.print.min.js"></script>
<!-- Librairies pour Excel/PDF -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script>
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<!-- Application Scripts -->
<script src="/Js/fonctions.js?ver=2026.01.20.11"></script>
<script type="text/javascript">
raffraichier_gabarit();
</script>
<script type="text/javascript">
setInterval(function() {
raffraichier_gabarit();
}, 10000);
</script>
<?php if (est_anglophone()): ?>
<script src="/Js/datepicker-eng.js"></script>
<?php else: ?>
<script src="/Js/datepicker-fr.js"></script>
<?php endif; ?>
<script>
$(function() {
<?php if (est_anglophone()): ?>
$.datepicker.setDefaults($.datepicker.regional["en"]); // ou "en" selon le fichier
$(".datepicker").datepicker({
dateFormat: "mm/dd/yy"
});
<?php else: ?>
$.datepicker.setDefaults($.datepicker.regional["fr"]);
$(".datepicker").datepicker({
dateFormat: "dd/mm/yy"
});
<?php endif; ?>
});
</script>
<!-- UX Enhancement Script -->
<script src="/Bootstrap_new/js/ux-manager.js?ver=2025.12.31.00"></script>
<!-- Service Worker Registration -->
<script src="/Js/sw-register.js?ver=2025.12.31.00"></script>
<script src="Bootstrap/vendor/apexcharts/apexcharts.min.js"></script>
<script src="Bootstrap/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="Bootstrap/vendor/chart.js/chart.umd.js"></script>
<script src="Bootstrap/vendor/echarts/echarts.min.js"></script>
<script>
// CORRECTION URGENTE - FORCE LE BON MENU
document.addEventListener('DOMContentLoaded', function() {
// Attendre que NavigationManager soit prêt
setTimeout(function() {
// 1. Vérifier l'état actuel
const openMenus = document.querySelectorAll('.nav-submenu.show');
// 2. Si submenu1 est ouvert mais on est sur Accueil
if (window.appConfig?.activeLink === 'Accueil') {
const wrongMenu = document.getElementById('submenu1');
const correctMenu = document.getElementById('submenu0');
if (wrongMenu?.classList.contains('show')) {
// FORCER LA CORRECTION
if (window.appUX?.navigation) {
// Fermer tous les menus
window.appUX.navigation.closeAllMenus();
// Ouvrir submenu0
setTimeout(() => {
window.appUX.navigation.openMenuById('submenu0');
}, 200);
}
// Fallback manuel
else {
// Fermer submenu1
wrongMenu.classList.remove('show');
const wrongLink = document.querySelector('[href="#submenu1"]');
if (wrongLink) {
wrongLink.setAttribute('aria-expanded', 'false');
wrongLink.classList.remove('active');
}
// Ouvrir submenu0
setTimeout(() => {
if (correctMenu) {
correctMenu.classList.add('show');
const correctLink = document.querySelector('[href="#submenu0"]');
if (correctLink) {
correctLink.setAttribute('aria-expanded', 'true');
correctLink.classList.add('active');
}
}
}, 100);
}
}
}
// Vérification finale
setTimeout(() => {
const finalState = document.querySelectorAll('.nav-submenu.show');
if (finalState.length === 1 && finalState[0].id === 'submenu0') {
}
}, 500);
}, 1000); // Attendre 1s que tout soit initialisé
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
// 1) Déplacer immédiatement tous les modals existants sous <body>
document.querySelectorAll('.modal').forEach(function (m) {
if (m.parentNode !== document.body) document.body.appendChild(m);
});
// 2) Intercepter tous les clics sur triggers AVANT Bootstrap (phase capture)
document.addEventListener('click', function (e) {
const trigger = e.target.closest('[data-bs-toggle="modal"][data-bs-target]');
if (!trigger) return;
const targetSelector = trigger.getAttribute('data-bs-target');
const modal = document.querySelector(targetSelector);
if (modal && modal.parentNode !== document.body) {
document.body.appendChild(modal);
}
}, true);
// 3) Fallback: si un modal s'ouvre autrement, garantir le déplacement
document.addEventListener('show.bs.modal', function (event) {
const modal = event.target;
if (modal && modal.parentNode !== document.body) {
document.body.appendChild(modal);
}
});
});
</script>
<script>
document.addEventListener("DOMContentLoaded", function () {
// On initialise les menus SANS les forcer à s'ouvrir
document.querySelectorAll('[data-submenu-target]').forEach(link => {
link.addEventListener('click', function (e) {
e.preventDefault();
const targetId = this.getAttribute('data-submenu-target');
const targetEl = document.getElementById(targetId);
if (targetEl) {
const instance = bootstrap.Collapse.getOrCreateInstance(targetEl, {
parent: '.nav-section', // Ferme les autres quand on en ouvre un
toggle: false
});
instance.toggle();
}
});
});
});
</script>
<script>
document.addEventListener("DOMContentLoaded", function () {
const btn = document.getElementById('userDropdownBtn');
if (btn) {
// On crée l'instance Bootstrap une seule fois
const dropdown = new bootstrap.Dropdown(btn);
btn.addEventListener('click', function (e) {
// ÉTAPE CLÉ : On empêche les autres scripts du header de bloquer le clic
e.preventDefault();
e.stopPropagation();
// On force l'ouverture/fermeture
dropdown.toggle();
});
}
// Sécurité : Fermer le menu si on clique n'importe où ailleurs sur la page
document.addEventListener('click', function (e) {
const btn = document.getElementById('userDropdownBtn');
if (btn && !btn.contains(e.target)) {
const instance = bootstrap.Dropdown.getInstance(btn);
if (instance) instance.hide();
}
});
});
</script>
</body>
</html>