valider
This commit is contained in:
parent
a1e1a75c0a
commit
1add3cde74
File diff suppressed because one or more lines are too long
|
|
@ -126,7 +126,7 @@ $photoAssureCrypte = $_SESSION['photoAssureCrypte'];
|
||||||
<link rel="manifest" href="<?= $racineWeb ?>manifest.json">
|
<link rel="manifest" href="<?= $racineWeb ?>manifest.json">
|
||||||
|
|
||||||
<!-- 4. VOS STYLES PERSONNALISÉS (en dernier pour qu'ils dominent) -->
|
<!-- 4. VOS STYLES PERSONNALISÉS (en dernier pour qu'ils dominent) -->
|
||||||
<link href="<?= $racineWeb ?>Bootstrap_new/css/style_office.css?ver=2026.02.04.04" rel="stylesheet">
|
<link href="<?= $racineWeb ?>Bootstrap_new/css/style_office.css?ver=2026.02.05.00" rel="stylesheet">
|
||||||
<link href="<?= $racineWeb ?>Bootstrap_new/css/ux_enhancements.css?ver=2025.12.21.02" rel="stylesheet">
|
<link href="<?= $racineWeb ?>Bootstrap_new/css/ux_enhancements.css?ver=2025.12.21.02" rel="stylesheet">
|
||||||
|
|
||||||
<!-- Charts -->
|
<!-- Charts -->
|
||||||
|
|
@ -721,45 +721,30 @@ $photoAssureCrypte = $_SESSION['photoAssureCrypte'];
|
||||||
<script src="Bootstrap/vendor/echarts/echarts.min.js"></script>
|
<script src="Bootstrap/vendor/echarts/echarts.min.js"></script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// CORRECTION URGENTE - FORCE LE BON MENU
|
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
|
||||||
// Attendre que NavigationManager soit prêt
|
/* ================================
|
||||||
|
1) Correction urgente - Forcer le bon menu
|
||||||
|
================================= */
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
// 1. Vérifier l'état actuel
|
|
||||||
const openMenus = document.querySelectorAll('.nav-submenu.show');
|
const openMenus = document.querySelectorAll('.nav-submenu.show');
|
||||||
|
|
||||||
// 2. Si submenu1 est ouvert mais on est sur Accueil
|
|
||||||
if (window.appConfig?.activeLink === 'Accueil') {
|
if (window.appConfig?.activeLink === 'Accueil') {
|
||||||
const wrongMenu = document.getElementById('submenu1');
|
const wrongMenu = document.getElementById('submenu1');
|
||||||
const correctMenu = document.getElementById('submenu0');
|
const correctMenu = document.getElementById('submenu0');
|
||||||
|
|
||||||
if (wrongMenu?.classList.contains('show')) {
|
if (wrongMenu?.classList.contains('show')) {
|
||||||
|
|
||||||
// FORCER LA CORRECTION
|
|
||||||
if (window.appUX?.navigation) {
|
if (window.appUX?.navigation) {
|
||||||
|
|
||||||
// Fermer tous les menus
|
|
||||||
window.appUX.navigation.closeAllMenus();
|
window.appUX.navigation.closeAllMenus();
|
||||||
|
|
||||||
// Ouvrir submenu0
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
window.appUX.navigation.openMenuById('submenu0');
|
window.appUX.navigation.openMenuById('submenu0');
|
||||||
|
|
||||||
}, 200);
|
}, 200);
|
||||||
}
|
} else {
|
||||||
// Fallback manuel
|
|
||||||
else {
|
|
||||||
|
|
||||||
// Fermer submenu1
|
|
||||||
wrongMenu.classList.remove('show');
|
wrongMenu.classList.remove('show');
|
||||||
const wrongLink = document.querySelector('[href="#submenu1"]');
|
const wrongLink = document.querySelector('[href="#submenu1"]');
|
||||||
if (wrongLink) {
|
if (wrongLink) {
|
||||||
wrongLink.setAttribute('aria-expanded', 'false');
|
wrongLink.setAttribute('aria-expanded', 'false');
|
||||||
wrongLink.classList.remove('active');
|
wrongLink.classList.remove('active');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ouvrir submenu0
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
if (correctMenu) {
|
if (correctMenu) {
|
||||||
correctMenu.classList.add('show');
|
correctMenu.classList.add('show');
|
||||||
|
|
@ -773,25 +758,21 @@ $photoAssureCrypte = $_SESSION['photoAssureCrypte'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Vérification finale
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
const finalState = document.querySelectorAll('.nav-submenu.show');
|
const finalState = document.querySelectorAll('.nav-submenu.show');
|
||||||
if (finalState.length === 1 && finalState[0].id === 'submenu0') {
|
if (finalState.length === 1 && finalState[0].id === 'submenu0') {
|
||||||
|
// OK
|
||||||
}
|
}
|
||||||
}, 500);
|
}, 500);
|
||||||
}, 1000); // Attendre 1s que tout soit initialisé
|
}, 1000);
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script>
|
/* ================================
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
2) Gestion des modals Bootstrap
|
||||||
// 1) Déplacer immédiatement tous les modals existants sous <body>
|
================================= */
|
||||||
document.querySelectorAll('.modal').forEach(function(m) {
|
document.querySelectorAll('.modal').forEach(function(m) {
|
||||||
if (m.parentNode !== document.body) document.body.appendChild(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) {
|
document.addEventListener('click', function(e) {
|
||||||
const trigger = e.target.closest('[data-bs-toggle="modal"][data-bs-target]');
|
const trigger = e.target.closest('[data-bs-toggle="modal"][data-bs-target]');
|
||||||
if (!trigger) return;
|
if (!trigger) return;
|
||||||
|
|
@ -802,19 +783,16 @@ $photoAssureCrypte = $_SESSION['photoAssureCrypte'];
|
||||||
}
|
}
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
// 3) Fallback: si un modal s'ouvre autrement, garantir le déplacement
|
|
||||||
document.addEventListener('show.bs.modal', function(event) {
|
document.addEventListener('show.bs.modal', function(event) {
|
||||||
const modal = event.target;
|
const modal = event.target;
|
||||||
if (modal && modal.parentNode !== document.body) {
|
if (modal && modal.parentNode !== document.body) {
|
||||||
document.body.appendChild(modal);
|
document.body.appendChild(modal);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script>
|
/* ================================
|
||||||
document.addEventListener("DOMContentLoaded", function () {
|
3) Gestion des sous-menus (Collapse)
|
||||||
// On initialise les menus SANS les forcer à s'ouvrir
|
================================= */
|
||||||
document.querySelectorAll('[data-submenu-target]').forEach(link => {
|
document.querySelectorAll('[data-submenu-target]').forEach(link => {
|
||||||
link.addEventListener('click', function(e) {
|
link.addEventListener('click', function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
@ -823,34 +801,27 @@ $photoAssureCrypte = $_SESSION['photoAssureCrypte'];
|
||||||
|
|
||||||
if (targetEl) {
|
if (targetEl) {
|
||||||
const instance = bootstrap.Collapse.getOrCreateInstance(targetEl, {
|
const instance = bootstrap.Collapse.getOrCreateInstance(targetEl, {
|
||||||
parent: '.nav-section', // Ferme les autres quand on en ouvre un
|
parent: '.nav-section',
|
||||||
toggle: false
|
toggle: false
|
||||||
});
|
});
|
||||||
instance.toggle();
|
instance.toggle();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
</script>
|
/* ================================
|
||||||
<script>
|
4) Dropdown utilisateur
|
||||||
document.addEventListener("DOMContentLoaded", function () {
|
================================= */
|
||||||
const btn = document.getElementById('userDropdownBtn');
|
const btn = document.getElementById('userDropdownBtn');
|
||||||
|
|
||||||
if (btn) {
|
if (btn) {
|
||||||
// On crée l'instance Bootstrap une seule fois
|
|
||||||
const dropdown = new bootstrap.Dropdown(btn);
|
const dropdown = new bootstrap.Dropdown(btn);
|
||||||
|
|
||||||
btn.addEventListener('click', function(e) {
|
btn.addEventListener('click', function(e) {
|
||||||
// ÉTAPE CLÉ : On empêche les autres scripts du header de bloquer le clic
|
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
|
|
||||||
// On force l'ouverture/fermeture
|
|
||||||
dropdown.toggle();
|
dropdown.toggle();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sécurité : Fermer le menu si on clique n'importe où ailleurs sur la page
|
|
||||||
document.addEventListener('click', function(e) {
|
document.addEventListener('click', function(e) {
|
||||||
const btn = document.getElementById('userDropdownBtn');
|
const btn = document.getElementById('userDropdownBtn');
|
||||||
if (btn && !btn.contains(e.target)) {
|
if (btn && !btn.contains(e.target)) {
|
||||||
|
|
@ -858,6 +829,17 @@ $photoAssureCrypte = $_SESSION['photoAssureCrypte'];
|
||||||
if (instance) instance.hide();
|
if (instance) instance.hide();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/* ================================
|
||||||
|
5) Ajouter étoile rouge aux champs required
|
||||||
|
================================= */
|
||||||
|
document.querySelectorAll('input[required], select[required], textarea[required]').forEach(function(el) {
|
||||||
|
let label = document.querySelector('label[for="'+el.id+'"]');
|
||||||
|
if (label && !label.querySelector('.required-star')) {
|
||||||
|
label.innerHTML += '<span class="required-star">*</span>';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user