- Added template loading for master-trainer/communication-templates in class-hvac-community-events.php
- Created page-master-communication-templates.php template with proper auth and navigation
- Fixed URL redirect issue preventing access to master trainer communication templates
- All master trainer pages now accessible without redirects
- Completed comprehensive master trainer dashboard fixes
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
175 lines
No EOL
6.6 KiB
JavaScript
175 lines
No EOL
6.6 KiB
JavaScript
/**
|
|
* HVAC Navigation - Robust & Simple
|
|
* Ensures navigation dropdowns work reliably for all users
|
|
*
|
|
* @version 1.0.1
|
|
* @since 2025-08-21
|
|
*/
|
|
|
|
// CRITICAL: Disable the original menu system IMMEDIATELY to prevent conflicts
|
|
// This must be set OUTSIDE of jQuery ready to ensure it's available first
|
|
window.hvacRobustNavigationActive = true;
|
|
|
|
jQuery(document).ready(function($) {
|
|
'use strict';
|
|
|
|
|
|
// CRITICAL FIX: Ensure navigation runs AFTER dashboard scripts
|
|
// Use a small delay to let dashboard scripts initialize first
|
|
setTimeout(function() {
|
|
initRobustNavigation();
|
|
}, 100);
|
|
|
|
// Ensure the menu system works even if other JavaScript fails
|
|
function initRobustNavigation() {
|
|
// Find all menu toggle elements
|
|
const $menuToggles = $('.hvac-trainer-menu .menu-toggle');
|
|
|
|
|
|
// AGGRESSIVE: Remove ALL competing handlers first
|
|
$menuToggles.off(); // Remove all handlers
|
|
$menuToggles.unbind(); // jQuery < 3.0 compatibility
|
|
|
|
// Add click handlers to dropdown toggles
|
|
$menuToggles.on('click.hvacRobust', function(e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
const $this = $(this);
|
|
const $menuItem = $this.closest('.menu-item');
|
|
const $submenu = $menuItem.find('> .sub-menu');
|
|
|
|
|
|
// Close other open menus at the same level
|
|
$this.closest('ul').find('> .menu-item.open').not($menuItem).removeClass('open');
|
|
|
|
// Toggle this menu - FORCE the class change
|
|
if ($menuItem.hasClass('open')) {
|
|
$menuItem.removeClass('open');
|
|
// Menu closed
|
|
} else {
|
|
$menuItem.addClass('open');
|
|
// Menu opened
|
|
}
|
|
|
|
// State updated
|
|
});
|
|
|
|
// Ensure hamburger menu works
|
|
const $hamburger = $('#hvac-hamburger-menu, .hvac-hamburger-menu');
|
|
const $menu = $('#hvac-trainer-menu, .hvac-trainer-menu');
|
|
|
|
if ($hamburger.length && $menu.length) {
|
|
|
|
// CRITICAL: Aggressively remove all existing handlers to prevent conflicts
|
|
// This ensures only our handler runs
|
|
$hamburger.off(); // Remove ALL handlers
|
|
$hamburger.unbind(); // jQuery < 3.0 compatibility
|
|
$hamburger.removeClass('active'); // Reset state
|
|
|
|
// Add only our handler with immediate effect
|
|
$hamburger.on('click.hvacRobust', function(e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
|
|
$hamburger.toggleClass('active');
|
|
$menu.toggleClass('active');
|
|
|
|
// Update aria attributes
|
|
const isOpen = $menu.hasClass('active');
|
|
$hamburger.attr('aria-expanded', isOpen);
|
|
|
|
// Menu state updated
|
|
});
|
|
|
|
// AGGRESSIVE: Monitor and remove conflicting handlers continuously
|
|
setInterval(function() {
|
|
const events = $._data($hamburger[0], 'events');
|
|
if (events && events.click && events.click.length > 1) {
|
|
// Remove conflicting handlers
|
|
// Keep only our namespaced handler
|
|
$hamburger.off('click');
|
|
$hamburger.on('click.hvacRobust', function(e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
$hamburger.toggleClass('active');
|
|
$menu.toggleClass('active');
|
|
const isOpen = $menu.hasClass('active');
|
|
$hamburger.attr('aria-expanded', isOpen);
|
|
// Menu state updated
|
|
});
|
|
}
|
|
}, 1000);
|
|
}
|
|
|
|
// Close menu when clicking outside (on mobile)
|
|
$(document).off('click.hvacRobustOutside').on('click.hvacRobustOutside', function(e) {
|
|
if (!$(e.target).closest('.hvac-trainer-nav').length) {
|
|
if (window.innerWidth <= 992) {
|
|
$menu.removeClass('active');
|
|
$hamburger.removeClass('active');
|
|
$hamburger.attr('aria-expanded', 'false');
|
|
}
|
|
|
|
// Close all open dropdowns
|
|
$('.hvac-trainer-menu .menu-item.open').removeClass('open');
|
|
}
|
|
});
|
|
|
|
// Handle window resize
|
|
$(window).off('resize.hvacRobust').on('resize.hvacRobust', function() {
|
|
if (window.innerWidth > 992) {
|
|
// Reset mobile menu state on desktop
|
|
$menu.removeClass('active');
|
|
$hamburger.removeClass('active');
|
|
$hamburger.attr('aria-expanded', 'false');
|
|
}
|
|
});
|
|
|
|
// Navigation initialized
|
|
}
|
|
|
|
// Removed immediate initialization - now handled by setTimeout above
|
|
|
|
// Reinitialize after AJAX or dynamic content changes
|
|
$(document).on('hvac-content-updated', initRobustNavigation);
|
|
|
|
// CRITICAL: Also reinitialize when dashboard AJAX completes
|
|
$(document).ajaxComplete(function(event, xhr, settings) {
|
|
// Check if this was a dashboard AJAX request
|
|
if (settings && settings.data && settings.data.indexOf('hvac_filter_events') > -1) {
|
|
// Dashboard AJAX completed, reinitializing navigation
|
|
setTimeout(initRobustNavigation, 100);
|
|
}
|
|
});
|
|
|
|
// Fallback initialization after a delay
|
|
setTimeout(function() {
|
|
// Check if dropdowns are working
|
|
const $firstToggle = $('.hvac-trainer-menu .menu-toggle').first();
|
|
if ($firstToggle.length) {
|
|
// Simulate a click to test functionality
|
|
const events = $._data($firstToggle[0], 'events');
|
|
if (!events || !events.click || events.click.length === 0) {
|
|
// No click handlers found, reinitializing
|
|
initRobustNavigation();
|
|
}
|
|
}
|
|
}, 1000);
|
|
|
|
// Extra safety net - ensure menu visibility
|
|
function ensureMenuVisibility() {
|
|
const $activeMenu = $('.hvac-trainer-menu.active');
|
|
if ($activeMenu.length && $activeMenu.is(':hidden')) {
|
|
$activeMenu.css({
|
|
'display': 'block',
|
|
'visibility': 'visible',
|
|
'opacity': '1'
|
|
});
|
|
}
|
|
}
|
|
|
|
// Check menu visibility periodically
|
|
setInterval(ensureMenuVisibility, 2000);
|
|
}); |