upskill-event-manager/assets/js/modal.js
Ben Reed cdc5ea85f4 feat: Add comprehensive CSS, JavaScript and theme asset infrastructure
Add massive collection of CSS, JavaScript and theme assets that were previously excluded:

**CSS Files (681 total):**
- HVAC plugin-specific styles (hvac-*.css): 34 files including dashboard, certificates, registration, mobile nav, accessibility fixes, animations, and welcome popup
- Theme framework files (Astra, builder systems, layouts): 200+ files
- Plugin compatibility styles (WooCommerce, WPForms, Elementor, Contact Form 7): 150+ files
- WordPress core and editor styles: 50+ files
- Responsive and RTL language support: 200+ files

**JavaScript Files (400+ total):**
- HVAC plugin functionality (hvac-*.js): 27 files including menu systems, dashboard enhancements, profile sharing, mobile responsive features, accessibility, and animations
- Framework and library files: jQuery plugins, GSAP, AOS, Swiper, Chart.js, Lottie, Isotope
- Plugin compatibility scripts: WPForms, WooCommerce, Elementor, Contact Form 7, LifterLMS
- WordPress core functionality: customizer, admin, block editor compatibility
- Third-party integrations: Stripe, SMTP, analytics, search functionality

**Assets:**
- Certificate background images and logos
- Comprehensive theme styling infrastructure
- Mobile-responsive design systems
- Cross-browser compatibility assets
- Performance-optimized minified versions

**Updated .gitignore:**
- Fixed asset directory whitelisting patterns to properly include CSS/JS/images
- Added proper directory structure recognition (!/assets/css/, !/assets/js/, etc.)
- Maintains security by excluding sensitive files while including essential assets

This commit provides the complete frontend infrastructure needed for:
- Full theme functionality and styling
- Plugin feature implementations
- Mobile responsiveness and accessibility
- Cross-browser compatibility
- Performance optimization
- Developer workflow support
2025-08-11 16:20:31 -03:00

122 lines
4.6 KiB
JavaScript

document.addEventListener( 'UAGModalEditor', function ( e ) {
UAGBModal.init( '.uagb-block-' + e.detail.block_id, true );
} );
document.addEventListener( 'AstraQuickViewForModal', function ( e ) {
UAGBModal.init( e.detail.class_name, false );
} );
window.UAGBModal = {
init( mainSelector, isAdmin ) {
const document_element = UAGBModal._getDocumentElement();
const modalWrapper = document_element.querySelectorAll( mainSelector );
const siteEditTheme = document_element.getElementsByClassName( 'edit-site' );
const pageTemplate = document_element.getElementsByClassName( 'block-editor-iframe__body' );
if ( modalWrapper?.length ) {
for ( const modalWrapperEl of modalWrapper ) {
const modalTrigger = modalWrapperEl.querySelector( '.uagb-modal-trigger' );
const closeOverlayClick = modalWrapperEl.dataset.overlayclick;
if ( modalTrigger ) {
modalTrigger.style.pointerEvents = 'auto';
const innerModal = modalWrapperEl?.querySelector( '.uagb-modal-popup' );
if ( ! innerModal ) {
continue;
}
if ( ! isAdmin ) {
document_element.body?.appendChild( innerModal );
}
const bodyWrap = document_element.querySelector( 'body' );
if ( ! bodyWrap ) {
continue;
}
modalTrigger.addEventListener( 'click', function ( e ) {
e.preventDefault();
if ( ! innerModal.classList.contains( 'active' ) ) {
innerModal.classList.add( 'active' );
// Once this modal is active, create a focusable element to add focus onto the modal and then remove it.
const focusElement = document.createElement( 'button' );
focusElement.style.position = 'absolute';
focusElement.style.opacity = '0';
const modalFocus = innerModal.insertBefore( focusElement, innerModal.firstChild );
modalFocus.focus();
modalFocus.remove();
if (
! bodyWrap.classList.contains( 'hide-scroll' ) &&
! siteEditTheme?.length &&
! pageTemplate?.length &&
! bodyWrap.classList.contains( 'wp-admin' )
) {
bodyWrap.classList.add( 'hide-scroll' );
}
}
} );
if ( '.uagb-modal-wrapper' === mainSelector ) { // When we get mainSelector as a uagb-modal-wrapper from AstraQuickViewForModal event we get null for closeModal. So avoid this we need to use uagb-modal-popup as mainSelector.
mainSelector = '.uagb-modal-popup';
}
const closeModal = innerModal.querySelector( `${ mainSelector } .uagb-modal-popup-close` );
if ( closeModal ) {
closeModal.addEventListener( 'click', function () {
if ( innerModal.classList.contains( 'active' ) ) {
innerModal.classList.remove( 'active' );
modalTrigger?.focus();
}
if ( bodyWrap.classList.contains( 'hide-scroll' ) ) {
UAGBModal.closeModalScrollCheck( bodyWrap, document_element );
}
} );
}
if ( 'disable' !== closeOverlayClick ) {
innerModal.addEventListener( 'click', function ( e ) {
if (
'enable' === closeOverlayClick &&
innerModal.classList.contains( 'active' ) &&
! innerModal.querySelector( '.uagb-modal-popup-wrap' ).contains( e.target )
) {
innerModal.classList.remove( 'active' );
}
if ( bodyWrap.classList.contains( 'hide-scroll' ) ) {
UAGBModal.closeModalScrollCheck( bodyWrap, document_element );
}
} );
}
document.addEventListener( 'keyup', function ( e ) {
const closeOnEsc = modalWrapperEl.dataset.escpress;
if ( 27 === e.keyCode && 'enable' === closeOnEsc ) {
if ( innerModal.classList.contains( 'active' ) ) {
innerModal.classList.remove( 'active' );
modalTrigger?.focus();
}
if ( bodyWrap.classList.contains( 'hide-scroll' ) ) {
UAGBModal.closeModalScrollCheck( bodyWrap, document_element );
}
}
} );
}
}
}
},
// Get the Document element if it's inside an iFrame.
_getDocumentElement() {
let document_element = document;
const getEditorIframe = document.querySelectorAll( 'iframe[name="editor-canvas"]' );
if ( getEditorIframe?.length ) {
const iframeDocument = getEditorIframe[0]?.contentWindow?.document || getEditorIframe[0]?.contentDocument;
if ( iframeDocument ) {
document_element = iframeDocument;
}
}
return document_element;
},
// Close the Modal and check if the Scrollbar needs to be reactivated.
closeModalScrollCheck( bodyWrapper, document_element ) {
const allActiveModals = document_element.querySelectorAll( '.uagb-modal-popup.active' );
if ( ! allActiveModals?.length ) {
bodyWrapper.classList.remove( 'hide-scroll' );
}
},
};