header.js 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. domReady(function() {
  5. const loadBtn = document.getElementById('loadBtn');
  6. if (loadBtn) {
  7. loadBtn.addEventListener('click', function(e) {
  8. e.preventDefault();
  9. window.location.href = '/projects';
  10. });
  11. }
  12. // Initialiser les dropdowns Bootstrap si disponible
  13. try {
  14. if (window.bootstrap && window.bootstrap.Dropdown) {
  15. const toggles = document.querySelectorAll('[data-bs-toggle="dropdown"]');
  16. toggles.forEach(function(toggle) {
  17. if (!bootstrap.Dropdown.getInstance(toggle)) {
  18. new bootstrap.Dropdown(toggle);
  19. }
  20. });
  21. }
  22. } catch (err) {
  23. console.warn('Bootstrap dropdown init failed:', err);
  24. }
  25. // Fallback et ajustements (copié depuis header-actions.js)
  26. (function() {
  27. const toggles = Array.from(document.querySelectorAll('[data-bs-toggle="dropdown"]'));
  28. if (!toggles.length) return;
  29. function closeAll() {
  30. document.querySelectorAll('.dropdown-menu.show').forEach(function(menu) {
  31. menu.classList.remove('show');
  32. });
  33. toggles.forEach(function(t) { t.setAttribute('aria-expanded', 'false'); });
  34. }
  35. toggles.forEach(function(toggle) {
  36. toggle.addEventListener('click', function(e) {
  37. try {
  38. if (window.bootstrap && window.bootstrap.Dropdown && bootstrap.Dropdown.getInstance(toggle)) {
  39. return;
  40. }
  41. } catch (_) {}
  42. e.preventDefault();
  43. e.stopPropagation();
  44. const parent = toggle.closest('.dropdown') || toggle.parentElement;
  45. const menu = parent ? parent.querySelector('.dropdown-menu') : null;
  46. if (!menu) return;
  47. const isOpen = menu.classList.contains('show');
  48. closeAll();
  49. if (!isOpen) {
  50. menu.classList.add('show');
  51. toggle.setAttribute('aria-expanded', 'true');
  52. adjustDropdownMenu(menu, toggle);
  53. }
  54. });
  55. });
  56. document.addEventListener('click', function() {
  57. closeAll();
  58. });
  59. })();
  60. function adjustDropdownMenu(menu, toggle) {
  61. if (!menu) return;
  62. menu.style.maxHeight = '';
  63. menu.classList.remove('dropdown-menu-end');
  64. const rect = menu.getBoundingClientRect();
  65. const vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);
  66. const vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);
  67. if (rect.right > vw - 8) {
  68. menu.classList.add('dropdown-menu-end');
  69. }
  70. const rect2 = menu.getBoundingClientRect();
  71. if (rect2.bottom > vh - 8) {
  72. const available = vh - 16 - rect2.top;
  73. if (available > 100) {
  74. menu.style.maxHeight = available + 'px';
  75. menu.style.overflowY = 'auto';
  76. }
  77. }
  78. }
  79. });
  80. })();