upskill-event-manager/assets/js/hvac-menu-system-safari-compatible.js
Ben bb3441c0e6 feat: Complete TEC integration with mobile fixes and comprehensive testing
- Added mobile navigation fix CSS to resolve overlapping elements
- Created TEC integration pages (create, edit, my events)
- Implemented comprehensive Playwright E2E test suites
- Fixed mobile navigation conflicts with z-index management
- Added test runners with detailed reporting
- Achieved 70% test success rate (100% on core features)
- Page load performance optimized to 3.8 seconds
- Cross-browser compatibility verified

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-18 07:07:06 -03:00

317 lines
No EOL
10 KiB
JavaScript

/**
* HVAC Menu System JavaScript - Safari Compatible Version
* Handle dropdown interactions and mobile menu behavior
*/
jQuery(function($) {
'use strict';
// Check if jQuery is available
if (typeof jQuery === 'undefined') {
console.error('HVAC Menu Safari: jQuery is not available');
return;
}
console.log('HVAC Menu Safari: jQuery loaded, version:', $.fn.jquery);
/**
* Initialize menu system
*/
function initHVACMenu() {
console.log('HVAC Menu Safari: Initializing menu system');
var $menu = $('.hvac-trainer-menu');
if (!$menu.length) {
return;
}
// Handle dropdown toggles
handleDropdownToggles($menu);
// Handle mobile menu
handleMobileMenu($menu);
// Handle keyboard navigation
handleKeyboardNavigation($menu);
// Close dropdowns when clicking outside
handleOutsideClick($menu);
// Set active menu items
setActiveMenuItem($menu);
}
/**
* Handle dropdown toggle functionality
*/
function handleDropdownToggles($menu) {
$menu.on('click', '.hvac-menu-item.has-submenu > a', function(e) {
e.preventDefault();
var $menuItem = $(this).parent();
var $submenu = $menuItem.find('.hvac-submenu');
var isOpen = $menuItem.hasClass('open');
// Close all other open dropdowns
$menu.find('.hvac-menu-item.open').removeClass('open');
$menu.find('.hvac-submenu').slideUp(200);
// Toggle current dropdown
if (!isOpen) {
$menuItem.addClass('open');
$submenu.slideDown(200);
}
});
}
/**
* Handle mobile menu functionality
*/
function handleMobileMenu($menu) {
// Updated to use the actual hamburger menu selectors
var $hamburger = $('#hvac-hamburger-menu');
var $menuElement = $('#hvac-trainer-menu');
// Fallback to old selectors if new ones don't exist
if (!$hamburger.length) {
$hamburger = $('.hvac-mobile-menu-toggle');
}
if (!$menuElement.length) {
$menuElement = $('.hvac-mobile-menu');
}
if (!$hamburger.length || !$menuElement.length) {
console.log('HVAC Menu Safari: No hamburger or menu found');
return;
}
console.log('HVAC Menu Safari: Setting up hamburger menu');
$hamburger.on('click', function(e) {
e.preventDefault();
e.stopPropagation();
console.log('HVAC Menu Safari: Hamburger clicked');
var isOpen = $menuElement.hasClass('active');
if (isOpen) {
$menuElement.removeClass('active');
$hamburger.removeClass('active');
$hamburger.attr('aria-expanded', 'false');
} else {
$menuElement.addClass('active');
$hamburger.addClass('active');
$hamburger.attr('aria-expanded', 'true');
}
});
// Close mobile menu when clicking outside
$(document).on('click.hvacMobileMenu', function(e) {
if ($(window).width() <= 992) {
if (!$(e.target).closest('.hvac-trainer-nav').length) {
$menuElement.removeClass('active');
$hamburger.removeClass('active');
$hamburger.attr('aria-expanded', 'false');
}
}
});
// Handle mobile submenu toggles
$menuElement.on('click', '.hvac-menu-item.has-submenu > a', function(e) {
var $menuItem = $(this).parent();
var $submenu = $menuItem.find('.hvac-submenu');
var isOpen = $menuItem.hasClass('open');
// Only prevent default for items with submenus
if ($submenu.length > 0) {
e.preventDefault();
if (isOpen) {
$menuItem.removeClass('open');
$submenu.slideUp(200);
} else {
$menuItem.addClass('open');
$submenu.slideDown(200);
}
}
});
}
/**
* Handle keyboard navigation
*/
function handleKeyboardNavigation($menu) {
$menu.on('keydown', 'a', function(e) {
var $currentLink = $(this);
var $currentItem = $currentLink.parent();
var $allLinks = $menu.find('a');
var currentIndex = $allLinks.index($currentLink);
var $targetLink;
switch (e.keyCode) {
case 27: // Escape key
// Close dropdown and return to parent
if ($currentItem.hasClass('hvac-submenu-item')) {
var $parentItem = $currentItem.closest('.hvac-menu-item.has-submenu');
$parentItem.removeClass('open');
$parentItem.find('.hvac-submenu').slideUp(200);
$parentItem.find('> a').focus();
}
break;
case 38: // Up arrow
e.preventDefault();
if (currentIndex > 0) {
$targetLink = $allLinks.eq(currentIndex - 1);
$targetLink.focus();
}
break;
case 40: // Down arrow
e.preventDefault();
if (currentIndex < $allLinks.length - 1) {
$targetLink = $allLinks.eq(currentIndex + 1);
$targetLink.focus();
}
break;
case 13: // Enter key
case 32: // Space key
if ($currentItem.hasClass('has-submenu')) {
e.preventDefault();
$currentLink.click();
}
break;
}
});
}
/**
* Close dropdowns when clicking outside
*/
function handleOutsideClick($menu) {
$(document).on('click', function(e) {
if (!$menu.is(e.target) && $menu.has(e.target).length === 0) {
$menu.find('.hvac-menu-item.open').removeClass('open');
$menu.find('.hvac-submenu').slideUp(200);
}
});
}
/**
* Set active menu item based on current URL
*/
function setActiveMenuItem($menu) {
var currentPath = window.location.pathname;
$menu.find('a').each(function() {
var $link = $(this);
var linkHref = $link.attr('href');
if (linkHref && currentPath.indexOf(linkHref.replace(window.location.origin, '')) !== -1) {
$link.addClass('current-page');
// Also mark parent menu item as active if this is a submenu item
var $parentMenuItem = $link.closest('.hvac-menu-item.has-submenu');
if ($parentMenuItem.length) {
$parentMenuItem.find('> a').addClass('current-parent');
}
}
});
}
/**
* Handle responsive menu behavior
*/
function handleResponsiveMenu() {
var $window = $(window);
var $menu = $('.hvac-trainer-menu');
var breakpoint = 768;
function checkMenuLayout() {
var windowWidth = $window.width();
if (windowWidth < breakpoint) {
$menu.addClass('mobile-layout');
// Close any open desktop dropdowns
$menu.find('.hvac-menu-item.open').removeClass('open');
$menu.find('.hvac-submenu').hide();
} else {
$menu.removeClass('mobile-layout');
// Close mobile menu if open
$('.hvac-mobile-menu').removeClass('open');
$('.hvac-mobile-menu-toggle').removeClass('active');
$('body').removeClass('mobile-menu-open');
}
}
// Check on resize
$window.on('resize', debounce(checkMenuLayout, 250));
// Check initially
checkMenuLayout();
}
/**
* Debounce function for performance
*/
function debounce(func, wait) {
var timeout;
return function() {
var context = this;
var args = arguments;
var later = function() {
timeout = null;
func.apply(context, args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
}
/**
* Handle help menu positioning
*/
function handleHelpMenuPositioning() {
var $helpMenu = $('.hvac-help-menu');
if (!$helpMenu.length) {
return;
}
$helpMenu.on('click', '.hvac-menu-item.has-submenu > a', function() {
var $submenu = $(this).siblings('.hvac-submenu');
var $menuContainer = $(this).closest('.hvac-trainer-menu');
if ($submenu.length && $menuContainer.length) {
// Adjust position if submenu would go off-screen
setTimeout(function() {
var submenuOffset = $submenu.offset();
var submenuWidth = $submenu.outerWidth();
var windowWidth = $(window).width();
if (submenuOffset.left + submenuWidth > windowWidth) {
$submenu.addClass('align-right');
} else {
$submenu.removeClass('align-right');
}
}, 10);
}
});
}
// Initialize when DOM is ready
$(document).ready(function() {
console.log('HVAC Menu Safari: Document ready');
initHVACMenu();
handleResponsiveMenu();
handleHelpMenuPositioning();
});
// Re-initialize if content is dynamically loaded
$(document).on('hvac-menu-refresh', function() {
initHVACMenu();
});
});