upskill-event-manager/assets/js/single-product-variations.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

131 lines
5.6 KiB
JavaScript

const triggerActiveAttributeButton = () => {
const activeAttributeButton = document.querySelector('.ast-variation-button-group .ast-single-variation.active');
if (activeAttributeButton) {
activeAttributeButton.click();
}
};
const productVariation = (image_slider_wrap) => {
const productSingleVariations = document.querySelectorAll( '.ast-single-variation' );
const productVariationReset = document.querySelector( '.reset_variations' );
// Resets Buttons on Clear Button.
if( productVariationReset ) {
productVariationReset.addEventListener( 'click', (e) => {
const allVariationButtons = document.querySelectorAll( '.ast-single-variation' );
allVariationButtons.forEach( element => {
element.classList.remove( 'active' );
element.style.opacity = '1';
element.style.pointerEvents = 'inherit';
} );
} );
}
if( productSingleVariations ) {
productSingleVariations.forEach( element => {
// Single Product Variation Buttons.
element.addEventListener( 'click', (e) => {
const allVariationButtons = e.target.closest( '.ast-variation-button-group' );
if( allVariationButtons ) {
const allVariationButtonSingle = allVariationButtons.querySelectorAll( '.ast-single-variation' );
if( allVariationButtonSingle ) {
allVariationButtonSingle.forEach( element => {
element.classList.remove( 'active' );
} );
}
}
const allVariationContainer = document.querySelector( '.ast-product-single-variable form .variations' )
if( allVariationContainer ) {
allVariationSelector = allVariationContainer.querySelectorAll( 'select' );
allVariationButton = allVariationContainer.querySelectorAll( '.ast-variation-button-group' );
// Enables and Disables Variation Buttons.
if( allVariationSelector && allVariationButton ) {
setTimeout( () => {
allVariationSelector.forEach( select => {
const options = select.querySelectorAll('option');
const node = [];
options.forEach( element => {
node.push( element.getAttribute('value') );
});
const buttons = select.nextElementSibling;
const buttonList = buttons !== null ? buttons.querySelectorAll('.ast-single-variation') : null;
if (buttonList !== null) {
buttonList.forEach(button => {
buttonList.forEach( element => {
if( ! node.includes( element.getAttribute('data-slug') ) ) {
element.style.opacity = '.5';
element.style.pointerEvents = 'none';
} else {
element.style.opacity = '1';
element.style.pointerEvents = 'inherit';
}
} ); });
}
} );
}, 100 );
}
}
const currentSlug = e.target.getAttribute( 'data-slug' );
const currentTarget = e.target.closest( 'td' ).querySelector( 'select' );
// On Variation Change Trigger Hidden Select.
if( currentSlug && currentTarget ) {
e.target.classList.add( 'active' );
currentTarget.value = currentSlug;
currentTarget.dispatchEvent( new Event( 'change', { 'bubbles': true } ) )
// Triggering the active Attribute button to ensure the state is updated
triggerActiveAttributeButton();
}
if (image_slider_wrap != null) {
image_slider_wrap.flexslider(0);
}
} );
} );
}
}
document.addEventListener("DOMContentLoaded", function(event) {
productVariation();
});
document.addEventListener( "astUpdateSingleProductVariations", function() {
productVariation();
});
// Composite product plugin compatibility.
jQuery('.composite_data').on('wc-composite-initializing', function (event, composite) {
composite.actions.add_action('component_scripts_initialized', function () {
productVariation();
}, 100)
});
// Adding Function to read URL parameters dynamically.
document.addEventListener("DOMContentLoaded", function () {
const urlParams = new URLSearchParams(window.location.search);
urlParams.forEach((value, key) => {
const variationButton = document.querySelector(`.ast-single-variation[data-slug="${value}"]`);
if (variationButton) {
variationButton.classList.add('active');
const selectElement = document.querySelector(`select[name="${key}"]`);
if (selectElement) {
selectElement.value = value;
selectElement.dispatchEvent(new Event('change', { bubbles: true }));
}
}
});
});