radiantrh/Vue/gabarit.php
2026-01-31 13:33:19 +00:00

868 lines
42 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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 RH 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.31.00" 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>
<?php
$infovue = $gabary->getInfosVue($_SESSION['vue']);
$descriptionVue = est_anglophone() ? $infovue['DescriptionEng'] : $infovue['Description'];
$titreRetour = est_anglophone() ? $infovue['titreRetourEng'] : $infovue['titreRetour'];
$retourVue = $infovue['lienRetour'];
//var_dump(array("Descrip =" => $descriptionVue, "retour" => $retourVue));
?>
<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>
<nav aria-label="breadcrumb" class="mt-4">
<ol class="breadcrumb shadow-sm bg-white p-2 px-3" style="--bs-breadcrumb-divider: '';">
<li class="breadcrumb-item small"><a href="<?= $retourVue;?>" class="text-decoration-none text-muted text-uppercase"><?= $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">
<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 fw-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.31.00"></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>