header.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // Utilise le helper domReady exposé globalement par core/dom-ready.js
  2. (function() {
  3. var domReady = (window.MG && window.MG.domReady) || window.__MG_domReady || function(cb){ if (document.readyState==='loading') document.addEventListener('DOMContentLoaded', cb); else cb(); };
  4. function initDropdowns() {
  5. const toggles = document.querySelectorAll('[data-bs-toggle="dropdown"]');
  6. if (!toggles.length) {
  7. return;
  8. }
  9. if (window.bootstrap && window.bootstrap.Dropdown) {
  10. var count = 0;
  11. toggles.forEach(function(toggle) {
  12. try {
  13. if (!window.bootstrap.Dropdown.getInstance(toggle)) {
  14. new window.bootstrap.Dropdown(toggle);
  15. count++;
  16. } else {
  17. }
  18. } catch (err) {
  19. // swallow initialization errors silently
  20. }
  21. });
  22. return; // Si Bootstrap fonctionne, ne pas activer le fallback
  23. } else {
  24. // fallback will be used
  25. }
  26. // Fallback manuel si Bootstrap absent
  27. function closeAll() {
  28. document.querySelectorAll('.dropdown-menu.show').forEach(function(menu) {
  29. menu.classList.remove('show');
  30. });
  31. toggles.forEach(function(t) { t.setAttribute('aria-expanded', 'false'); });
  32. }
  33. toggles.forEach(function(toggle) {
  34. toggle.addEventListener('click', function(e) {
  35. e.preventDefault();
  36. e.stopPropagation();
  37. const parent = toggle.closest('.dropdown') || toggle.parentElement;
  38. const menu = parent ? parent.querySelector('.dropdown-menu') : null;
  39. if (!menu) return;
  40. const isOpen = menu.classList.contains('show');
  41. closeAll();
  42. if (!isOpen) {
  43. menu.classList.add('show');
  44. toggle.setAttribute('aria-expanded', 'true');
  45. adjustDropdownMenu(menu, toggle);
  46. }
  47. });
  48. });
  49. document.addEventListener('click', function() {
  50. closeAll();
  51. });
  52. function adjustDropdownMenu(menu, toggle) {
  53. if (!menu) return;
  54. menu.style.maxHeight = '';
  55. menu.classList.remove('dropdown-menu-end');
  56. const rect = menu.getBoundingClientRect();
  57. const vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);
  58. const vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);
  59. if (rect.right > vw - 8) {
  60. menu.classList.add('dropdown-menu-end');
  61. }
  62. const rect2 = menu.getBoundingClientRect();
  63. if (rect2.bottom > vh - 8) {
  64. const available = vh - 16 - rect2.top;
  65. if (available > 100) {
  66. menu.style.maxHeight = available + 'px';
  67. menu.style.overflowY = 'auto';
  68. }
  69. }
  70. }
  71. }
  72. domReady(function() {
  73. const loadBtn = document.getElementById('loadBtn');
  74. if (loadBtn) {
  75. loadBtn.addEventListener('click', function(e) {
  76. e.preventDefault();
  77. window.location.href = '/projects';
  78. });
  79. }
  80. // Initialiser les dropdowns immédiatement si Bootstrap est disponible
  81. if (window.bootstrap && window.bootstrap.Dropdown) {
  82. initDropdowns();
  83. } else {
  84. // Si Bootstrap n'est pas encore chargé, attendre avec plusieurs tentatives
  85. var attempts = 0;
  86. var checkBootstrap = setInterval(function() {
  87. attempts++;
  88. if (window.bootstrap && window.bootstrap.Dropdown) {
  89. clearInterval(checkBootstrap);
  90. initDropdowns();
  91. } else if (attempts >= 20) {
  92. clearInterval(checkBootstrap);
  93. initDropdowns(); // Tenter quand même avec le fallback
  94. }
  95. }, 50);
  96. }
  97. });
  98. // Exposer une fonction globale pour réinitialiser les dropdowns
  99. window.initDropdownsManually = function() {
  100. initDropdowns();
  101. };
  102. })();